2012-06-19 3 views
2

Я пытаюсь создать CustomControl, который будет иметь различные свойства, затронутые перечислением, найденным в ViewModel. Созданный CustomControl вызывается в представлении.Привязка функции CustomControl DependencyProperty к перечислению ViewModel

Я хотел бы перечисление привязки, чтобы изменить пару вещей в контроле, они включают в себя:

  • Изменение источника изображения (изображения изменяется на статичны в папке, созданной внутри библиотеки CustomControl)
  • Изменять свойство TextBlocks Text, опять же, параметры текста будут статическими между одним из X случаев (X - количество возможных состояний перечисления (также не изменяется)).

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


Итак, мой вопрос является то, что будет лучшим способом осуществить то, что описано выше?

Я уже думал о двух возможных путях:

  1. Expose полезных типов DP и связывают эти свойства в том же перечисление (например, property1 = "{Binding} someEnum" свойство2 = "{Binding} someEnum"), а также предоставить ValueConvertor для преобразования этих перечислений в полезные типы, которые затем может использовать CustomControl,
  2. Или выведите один DP, который принимает перечисление, а затем изменит свойства в другом месте в коде CustomControl, в зависимости от значения связанное перечисление?

Я довольно удобен с выполнением опции 1 с преобразователем значений в файле кода представления. Тем не менее, я хотел бы избежать этого, так как это сделает управление менее независимым.

Что касается второго варианта, я не совсем уверен, как это сделать так, чтобы статьи или небольшое объяснение помогли бы, если вы считаете, что это путь - возможно, внедрение INoitifyPropertyChanged на DP, чтобы контроль знал его ценность был изменен, когда изменено перечисление Bound?

Кроме того, я не ограничиваюсь этим, описанным двумя способами, если вы чувствуете, что есть лучший способ, пожалуйста, предложите это!

Я использую WPF (C#) совместно с MVVM-архитектурой (MVVM Light Toolkit).

Быстрое примечание. Я бы хотел избежать изменения ViewModel. Открытое перечисление и вся логика должны оставаться такими, какие они есть, если абсолютно не необходимо!

Заранее благодарим за ваши ответы, и я попытаюсь как можно подробнее обновить этот вопрос с ответами и обновлениями относительно личного прогресса в этой проблеме, а также возможной дополнительной информации, которая была запрошена!

ответ

0

Оба ваших решения должны работать нормально.

Для второго решения, все, что вам нужно, это зарегистрировать собственность зависимых пакетов с PropertyChangedCallback:

public static readonly DependencyProperty MyPropertyProperty = 
     DependencyProperty.Register("MyProperty", typeof(EnumType), typeof(MyClass), new PropertyMetadata(new PropertyChangedCallback(MyPropertyChangedHandler))); 

static void MyPropertyChangedHandler(DependencyObject obj, DependencyPropertyChangedEventArgs args) 

Проверить эту нить для использования FrameworkPropertyMetadata, UIPropertyMetadata и PropertyMetadataWhen should I use FrameworkPropertyMetadata or UIPropertyMetadata over plain PropertyMetadata?

преимущества ваших первое решение состоит в том, что он светлый, вам нужно всего лишь 2 ValueConvertors, нет необходимости в свойстве зависимостей, так что другой разработчик может понять, что существует прямая зависимость между перечислением и этими свойствами только через looki на вашем xaml. Недостаток заключается в том, что если вы планируете использовать свой настраиваемый элемент управления с одной и той же логикой в ​​нескольких местах, скопировать вставку этих преобразователей не очень аккуратно.

Второе решение - это зеркало к первому, у вас есть преимущество более высокого уровня повторного использования, но ваша логика встроена глубоко в ваш контроль.

+0

Большое спасибо за быстрый ответ. Только один вопрос, используя предложенный метод, должен ли я создать дублированный список перечислений для того, который находится в моей модели ViewModel в коде CustomControls, так что оба они содержат одни и те же элементы? – user1467655

+0

Нет, вы привяжете свое новое свойство зависимостей к ViewModel. Связывание - это способ создания связи между целью и источником, поэтому вам не придется дублировать что-либо. –

+0

Проблема в том, что я не знаю, какой тип назначить DependencyProperty, когда я его создаю, поскольку тип перечисления в виртуальной машине не доступен в моем CustomControl. 'DependencyProperty.Register (« MyProperty », typeof (EnumType), typeof (MyClass), новый PropertyMetadata (новый PropertyChangedCallback (MyPropertyChangedHandler));' - Что нужно заменить здесь «EnumType»? Извините за мое замешательство! – user1467655

Смежные вопросы