C # - Передача Просмотр в конвертер в качестве параметра - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть представление с парой шаблонов данных в ресурсах этого представления. (я не хочу размещать его где-то глобально, так как он нужен только для этого конкретного представления)

На основании значения, которое я получаю в конвертере, я переключаю шаблон.

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 ]

4 голосов
/ 19 сентября 2011

Я предлагаю следующее решение:

 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 голос
/ 19 сентября 2011

Похоже, вам нужен какой-то DataTemplateSelector . К сожалению, этот класс существует только в WPF, но вы можете найти некоторые альтернативные реализации в Интернете. Например: http://skysigal.xact -solutions.com / Блог / табетический / 427 / EntryID / 1404 / Silverlight-а-порт-оф-DataTemplateSelector.aspx

Идея состоит в том, чтобы иметь элемент управления контентом, который имеет массив шаблонов данных. Выбор отображаемого содержимого основан на значении (в вашем случае это целое число).

...