2

我有一个视图,该视图的资源中有几个数据模板(我不想把它放在全局的地方,因为它只需要这个特定的视图)

根据我在转换器中获得的值,我切换模板。

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();
        }
    }

这按预期工作,但是因为我实例化 new IdtDetailView(),我遇到了一些变量设置不正确等问题。因此我的问题是......

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

4

2 回答 2

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}"/>

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

于 2011-09-19T12:39:50.983 回答
1

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

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

于 2011-09-19T00:47:01.563 回答