Привязка переменной представления к UserControl ViewModel, объявленному внутри представления - PullRequest
0 голосов
/ 27 сентября 2018

Я застрял в этой проблеме несколько дней, не могу ее решить:

У меня есть несколько представлений V1, V2, ..., с моделью представления V1vm,V2vm, ..., каждый с использованием UserControl MyUC, с моделью представления MyUCvm.UserControl MyUC зависит от bool присоединенного свойства myParam.Допустим, представление V1 определяет значение через CheckBox.Я могу связать myParam с CheckBox.IsChecked в V1 XAML:

<UserControl x:Class="V1" ...>
   ...
   <CheckBox x:Name="cb" />
   <MyUC local:MyUC.myParam="{Binding ElementName=cb, Path=IsChecked}" />
</UserControl>

В модели представления MyUCvm Я объявляю свойство:

public class MyUCvm : ViewModelBase
{
   private bool _condition;
   public bool Condition
   {
       get { return condition; }
       set
       {
          _condition = value;
          Notify("Condition");
       }
   }
   ...
}

Я хочу Condition должен быть привязан к myParam, так что то, что отображается MyUC в представлении V1, зависит от флажка cb (и других шаблонов для других представлений).

Может быть, я смогу написать в V1vm обновление MyUCvm в C #.Но я считаю, что это не правильный путь.

Мне кажется, что более "чисто" связать myParam в MyUC XAML с Condition, с каким-то (не работающим) кодом:

<UserControl x:Class="MyUC" ...>
   ...
   <WHAT_TO_PUT_HERE? local:MyUC.myParam="{Binding Condition, Mode=TwoWay}" />
   ...
</UserControl>

Я нацеливаюсь на правильное решение?Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

На самом деле, вместо того, чтобы все крутить, я решил использовать простую логику ViewModel, которая намного проще.

В ViewModels V1vm и V2vm я определяю свойство типа MyUCvm, которое я использую для определения DataContext элемента <local:MyUC DataContext={Binding RefToMyUCvm} ... /> xaml в представлениях V1 и V2.

В V1vm и V2vm Я использую свойство bool MyParam для привязки к CheckBox.IsChecked (или что-то еще ...).И я делаю работу в getter / setter собственности.

public class V1vm : ViewModelBase
{
  //...

  public MyUCvm RefToUCvm { get; set; }

  public bool MyParam
  {
     get { return MyUCvm?.MyParam ?? false; }
     set
     {
         if (MyUCvm != null)
         {
              MyUCvm.MyParam = value;
              NotifyPropertyChanged("MyParam");
         }
      }
   }
}

Это намного проще и проще ...

0 голосов
/ 27 сентября 2018

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

Вы, конечно, все еще можете получить и установить привязываемые свойства viewModel из получения и набора зарегистрированного свойства зависимости.Тем не менее, это будет лучшим выбором.

Так что создайте DependencyProperty для вашего типа контроллера, дайте ему имя и зарегистрируйте onChanged, если вы хотите отслеживать его в коде.Затем создайте свои свойства get и установите для него свойство указывать на зависимость.

Из них скомпилируйте и снова откройте файл xaml, который пытается его использовать, и теперь это свойство будет присутствовать в intellisense с автозаполнением.для вас, чтобы связать.

Happy Coding.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...