WPF MVVM - Пользовательский элемент управления не будет привязываться к видимости, если я установлю DataContext для кода - PullRequest
4 голосов
/ 02 сентября 2010

Я хотел сделать быстрый пользовательский контроль для своего приложения, но чтобы сохранить вещи в стиле MVVM, я решил установить DataContext из XAML в код, указанный в моем UserControl.

т.е.1003 *

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Это позволяет мне связать XAML со свойствами в моем коде позади.

Все шло хорошо, пока я не стал связывать видимость экземпляра элемента управления со свойством Visibility наViewModel.

<Controls:RoundProgress Visibility="{Binding ProgressVisibility}" Width="100" Height="100"></Controls:RoundProgress>

Видимость больше не работает - если я удаляю свои повороты с DataContext из пользовательского элемента управления - видимость работает!

Может кто-нибудь настроить меня, пожалуйста?Спасибо

Ответы [ 2 ]

11 голосов
/ 02 сентября 2010

Не устанавливайте DataContext самого UserControl из внутреннего XAML.Этим вы переопределяете унаследованный DataContext и заставляете свой Binding искать свойство ProgressVisibility в UC вместо ViewModel.Вместо этого установите DataContext для элемента внутри UC:

<UserControl x:Class...>
  <Grid DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}">
    ...
  </Grid>
</UserControl>
2 голосов
/ 02 сентября 2010

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

Если в вашем коде есть свойство, указывающее на модель представления, вы можете сделать это:

<Controls:RoundProgress Visibility="{Binding ViewModel.ProgressVisibility}" ...

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

<Button Text="{Binding ButtonText, Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type MyUserControl}}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...