Я использую WPF RelativeSource
Binding
в DataTemplate
для одного из моих классов ViewModel, например, так:RelativeSource BindingExpression ошибка
<DataTemplate x:Type="{x:Type ViewModelB}">
<Grid Visibility="{Binding DataContext.MyBoolProperty,
RelativeSource={RelativeSource AncestorType=ContentControl},
Converter={StaticResource BooleanToVisibilityConverter}}">
</Grid>
</DataTemplate>
Корень ViewModel, ViewModelA
, имеет экземпляр этого ViewModel в качестве публичной собственности, а также имеет DataTemplate
для него, как это:
<DataTemplate x:Type="{x:Type ViewModelA}">
<ContentPresenter Content="{Binding ViewModelBProperty}" />
</DataTemplate>
Как вы видите, я хочу кое о View для ViewModelB
, которые инициированы Visible
или Hidden
на основании имущества, которое находится на ViewModelA
.
Этот подход работает отлично.
Однако ViewModelA
сам также представлен в ContentPresenter
. Когда я изменить содержание этого ContentPresenter
(например, ViewModelC
), я представил с некоторыми связующими исключениями в моем журнале отладки, такие как:
System.Windows.Data Error: 40 : BindingExpression path error: 'MyBoolProperty' property not found on 'object' ''ViewModelC' (HashCode=56562781)'. BindingExpression:Path=DataContext.MyBoolProperty; DataItem='ViewModelC' (Name=''); target element is 'Grid' (Name=''); target property is 'Visibility' (type 'Visibility')
Я угадывание здесь, что Binding
к DataContext получит обновление до фактическое представление расположено. Что можно сделать, чтобы исправить это поведение?
Если у вас нет привязки FindAncestor? вроде этого. –
Muds
Вы правы, чего не хватает. Однако, по-видимому, это значение по умолчанию, так как оно работает без него, и добавление его не имеет значения. – UrbanEsc
О, хорошо, я вижу это в первом взгляде и думал, что это может быть полезно иметь на месте! – Muds