C# - 将视图作为参数传递给转换器

时间:2011-09-18 23:11:41

标签: c# silverlight binding converters

我在该视图的资源中有一些视图,其中包含几个数据模板(我不想把它放在全球某处,因为这个特殊视图只需要它)

基于我在转换器中获得的值,我切换模板。

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?

2 个答案:

答案 0 :(得分: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}"/>

如您所知,您可以将转换器放在用户控制资源中的本地数据模板附近

答案 1 :(得分:1)

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

我们的想法是拥有一个包含数据模板数组的内容控件。显示内容的选择基于一个值(在您的情况下,它是一个整数)。