2011-09-18 36 views
2

我有一个视图有几个数据模板资源视图的(我不想把它放在全球因为其唯一通过这期特别需要)基于值I转换得到我切换模板C# - 查看传递到转换器的参数

public class SplitTemplateSelector : IValueConverter 
    { 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      int splitCount = (int)value; 
      var _view = new IdtDetailView(); 

      DataTemplate template; 
      if (splitCount == 1) 
      { 
       //(DataTemplate)_view.Resources["SingleSplitTemplate"]; 
       template = (DataTemplate)_view.Resources.Where(w => w.Key.Equals("SingleSplitTemplate")).FirstOrDefault().Value; 
      } 
      else 
      { 
       template = (DataTemplate)_view.Resources.Where(w => w.Key.Equals("MultiSplitTemplate")).FirstOrDefault().Value; 
      } 

      return template; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 
    } 

这按预期工作,但因为我实例化新IdtDetailView(),我跑到那里变量没有设置正确等。因此,我的问题是一些问题...

我如何传递或访问视图,调用此转换器,以便我不必创建新的IdtDetailView?

+0

另外请注意,我m使用Keys来查找数据模板,因为如果我只是使用名称,第二次我会调用此转换器SL会抱怨具有以下名称的数据模板已经存在。 – Luke

回答

4

我建议未来的解决方案:

public class SplitTemplateSelector : DependencyObject, IValueConverter 
    { 
     public static readonly DependencyProperty SingleSplitTemplateProperty = 
      DependencyProperty.Register("SingleSplitTemplate", 
             typeof (DataTemplate), 
             typeof(SplitTemplateSelector), 
             null); 

     public DataTemplate SingleSplitTemplate 
     { 
      get { return (DataTemplate) GetValue(SingleSplitTemplateProperty); } 
      set { SetValue(SingleSplitTemplateProperty, value); } 
     } 

     public static readonly DependencyProperty MultiSplitTemplateProperty = 
      DependencyProperty.Register("MultiSplitTemplate", 
             typeof (DataTemplate), 
             typeof(SplitTemplateSelector), 
             null); 

     public DataTemplate MultiSplitTemplate 
     { 
      get { return (DataTemplate) GetValue(MultiSplitTemplateProperty); } 
      set { SetValue(MultiSplitTemplateProperty, value); } 
     } 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      int splitCount = (int)value; 
      return splitCount == 1 ? SingleSplitTemplate : MultiSplitTemplate; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 

    } 

在XAML:

<c:SplitTemplateSelector x:Key="SplitTemplateSelector" SingleSplitTemplate="{StaticResource SingleSplitTemplate}" MultiSplitTemplate="{StaticResource MultiSplitTemplate}"/> 

当你明白了,你可以把附近的本地数据模板转换器在用户控制资源

+0

一如既往,答案是正确的。我需要数据模板选择器和转换器之间的混合。 – Luke

1

听起来像你需要某种DataTemplateSelector。 不幸的是,这个类只存在于WPF中,但您可以在网上找到一些替代实现。 例如: http://skysigal.xact-solutions.com/Blog/tabid/427/entryid/1404/Silverlight-a-port-of-the-DataTemplateSelector.aspx

这个想法是有一个内容控件有一个数组模板的数组。显示内容的选择是基于一个值(在你的情况下它是一个整数)。

+0

我已经设法从Telerik实现DataTemplateSelector,但是现在我无法获得ItemsSource的Count属性,因为我的选择是基于可观察集合中的行数。有任何想法吗? – Luke