Свойство UserControl «реле» между внутренними элементами управления и моделью представления;не чувствует / работает правильно - PullRequest
1 голос
/ 21 марта 2012

Я делаю простой пользовательский контроль.Например:

<UserControl x:Class="FileSelectionControl">
  <StackPanel>
    <Label>File path:</Label>
    <TextBox
      Text="{Binding Path=SelectedFile,
              RelativeSource={RelativeSource Mode=FindAncestor,
                                AncestorType=l:FileSelectionControl},
              Mode=TwoWay,
              Converter={StaticResource fileInfoToStringConverter},
              UpdateSourceTrigger=LostFocus,
              ValidatesOnDataErrors=True}" />
  </StackPanel>
</UserControl>

SelectedFile - это свойство (DependencyProperty), предоставляемое моим UserControl, которое содержит FileInfo для представления выбранного / указанного файла.Он предназначен для привязки к свойству модели представления.

Настройка привязки, чуть более общая:

Illustration

Этот вид работает, хотя не правильно, и это делаетне чувствую себя хорошо.Свойство SelectedFile действует как реле между внутренними элементами управления и моделью представления.Было бы проще, если бы текстовое поле было привязано к одному и тому же источнику. SelectedFile был установлен в ...

Например, у меня есть один недостаток - проверка ввода.Viewmodel реализует IDataErrorInfo.Если я включаю проверку для SelectedFile, UserControl будет выделен.Но мне нужно подтверждение (уведомление) для внутреннего текстового поля.

Так, что будет хорошим способом справиться с этим?

Добавлено 2012-03-30 (пользовательуправляющая модель представления вместо пользовательских свойств):

Я думал, что пользовательский элемент управления больше похож на пользовательский элемент управления ... Что, если я реализовал CustomControl с ControlTemplate и TemplateBindings для пользовательских свойств CustomControl (во многом как в моем первоначальном подходе))?(D) Ps на контроле - путь, не так ли?Я не думаю, что связанная модель представления создаст приемлемый «интерфейс» для CustomControl.

1 Ответ

2 голосов
/ 21 марта 2012

Обычно, если UserControl достаточно сложен, чтобы требовать своего собственного ViewModel, все мои свойства помещаются в ViewModel, а UserControl не имеет свойств зависимости, за исключением, возможно, свойства ViewModel.

Например, я мог бы использовать его таким образом, и UserControl предположить, что DataContext имеет тип FileSelectionViewModel:

<DataTemplate DataType="{x:Type FileSelectionViewModel}">
    <my:FileSelectionUserControl />
</DataTemplate>

Или я мог бы сделать это, и мой UserControl использовал бы привязку RelativeSource для ссылки на свойство ViewModel на себе:

<my:FileSelectionUserControl FileSelectionViewModel="{Binding FileSelectionVM}" />

Обычно единственный раз, когда я делаю свойства зависимостей для UserControl, это когда свойство относится только к представлению, а не к данным, таким как свойство IsSomeFeatureVisible.

...