2016-10-17 1 views
0

Я использую MVVM с библиотеками Galasoft MVVMLight.Сделать обновление свойства в одном классе триггером setter для свойства этого типа в другом классе

У меня есть две модели; каждый имеет логическое свойство и различные свойства одного и того же типа.

public class Model1 : ObservableObject 
{ 
    public EnumPair<YesNoInherit> Model1Property 
    { 
     get { return _model1Property; } 
     set 
     { 
      _model1Property = value; 
      Updated = true 
      RaisePropertyChanged("Model1Property"); 
     } 
    } 

    public bool Updated 
    { 
     get { return _updated; } 
     set 
     { 
      _updated = value; 
      RaisePropertyChanged("Updated"); 
     } 
    } 
} 

public class Model2 : ObservableObject 
{ 
    public EnumPair<YesNoInherit> Model2Property 
    { 
     get { return _model2Property; } 
     set 
     { 
      _model2Property = value; 
      Updated = true 
      RaisePropertyChanged("Model2Property"); 
     } 
    } 

    public bool Updated 
    { 
     get { return _updated; } 
     set 
     { 
      _updated = value; 
      RaisePropertyChanged("Updated"); 
     } 
    } 
} 

Тип YesNoInherit - это перечисление, имеющее значения No, Yes и Inherit.

Это класс EnumPair.

public class EnumPair<T> : ObservableObject where T : struct, IConvertible 
{ 
    public T EnumValue 
    { 
     get { return _enumValue; } 
     set 
     { 
      if (Type.Equals(value, _enumValue) == false) 
      { 
       _enumValue = value; 
       RaisePropertyChanged(); 
      } 
     } 
    } 

    public string SourceName 
    { 
     get { return _sourceName; } 
     set 
     { 
      _sourceName = value; 
      RaisePropertyChanged(); 
     } 
    } 
} 

На мой взгляд, я пытаюсь использовать ComboBox, чтобы позволить пользователю выбрать один из трех значений перечислений, а также, в некоторых случаях, отображать пользовательский текст. Ресурс «enumComboBoxTemplate» позволяет выпадающему списку ComboBox отображать описания перечислений. Конвертер «inheritanceEnum2Desc» - это место, где будет применен пользовательский текст. «object1» - это экземпляр «Model1».

<ComboBox ItemTemplate=ItemTemplate="{StaticResource enumComboBoxTemplate}" 
      EnumSource="enums:YesNoInherit"> 
    <ComboBox.Text> 
     <MultiBinding Converter="{StaticResource inheritanceEnum2Desc}"> 
      <Binding Path="object1.EnumValue"/> 
      <Binding Path="object1.SourceName"/> 
     </MultiBinding> 
    </ComboBox.Text> 
</ComboBox> 

«Model2» будет использоваться в будущих программах, использующих аналогичные функции, но с разными данными.

Когда я изменяю выделение в ComboBox, я хочу изменить значение «Обновлено» (от false до true), поэтому я могу включить кнопку в представлении. По-видимому, это требует, чтобы класс EnumPair каким-то образом заставлял программу выполнять setter для Model1Property. Поскольку у двух классов модели есть свойства типа EnumPair, я не верю, что могу добавить какой-либо код в EnumPair, специфичный для любого класса модели.

Как это сделать? Я был бы очень признателен за любую помощь.

+0

«Модель 2» будет использоваться в будущем программировании с использованием аналогичных функций, но с разными данными ». Похоже, вам не следует создавать два отдельных класса, а вместо этого создавать два отдельных экземпляра. Однако я действительно не понимаю. Это похоже на то, что вам нужен ViewModelLocator для доступа к вашим статическим ViewModels. Опишите вашу проблему дальше. – chris579

ответ

0

Если вы хотите иметь возможность легко перейти от одного класса к другому в будущем, не переписывая весь свой код, вам необходимо создать интерфейс, который определяет все вещи, которые имеют две модели, и оба классам необходимо реализовать интерфейс. Вы могли бы назвать интерфейс IModel1

Итак, вместо того, чтобы иметь «Model1» в вашей модели просмотра, вместо этого вы должны иметь «IModel1» в вашей модели. Вы можете передать тот же объект, который вы сейчас проходите, который имеет тип Model1, потому что он реализует интерфейс IModel1. Когда вы будете готовы к переключению, перейдите в Model2 вместо этого, и он будет работать без необходимости переписывать что-либо в вашем представлении или в режиме просмотра. Ваши сеттеры могут быть совершенно разными - пока обе модели имеют все методы и свойства, необходимые интерфейсу, вы будете в порядке.

В качестве альтернативы, если Model2 точно такой же, как Model1, за исключением того, что он имеет «лишний материал», вы можете сделать Model2 производным классом, который является производным от Model1.

Поиск в Google этих терминов должен указывать на хороший учебник.

+0

, если вы имеете в виду изменение с Model1 на Model2, я этого не делаю.Model1 находится в одном представлении, а Model2 - в другом представлении. Model1 и Model2 не связаны друг с другом, кроме каждого класса, имеющего свойство EnumPair. В одном приложении (App1) его combobox привязан к объекту1.Model1Property.EnumValue; в другом приложении (App2), его combobox привязан к объекту2.Model2Property.EnumValue. Если в App1 я изменяю значение combobox, код в setter для Model1Property должен запускаться; если в App2 я изменяю значение combobox, код в setter для Model2Property должен работать. Изменит ли это ваш ответ? – rebeldeveloper

+0

Да, это меняет ответ. В Model1 и Model2 просто используйте другой код в своем сетевом устройстве (имеют ли свойства EnumPair одно и то же имя и тот же тип или нет). Зачем вам нужно использовать одну и ту же логику в обоих классах моделей только потому, что они оба имеют один и тот же тип имущество? Это похоже на то, что Window1 и Window2 должны иметь один и тот же заголовок только потому, что оба они имеют свойство Title, или что Button1 и Button2 нуждаются в одном и том же поведении OnClick только потому, что обе кнопки имеют событие OnClick. Какова фактическая проблема, с которой вы сталкиваетесь? –

1

В принципе, у вас есть два варианта: либо использовать какую-либо шину сообщений для обновления другой модели (Prism имеет EventAggregator, не уверен в MVVMLight) или сделать оба экземпляра модели перенаправленными их свойствами в общий источник данных, который уведомляет все его пользователей при изменении свойств.

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