2015-04-13 3 views
1

Я использую WPF RelativeSourceBinding в 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 получит обновление до фактическое представление расположено. Что можно сделать, чтобы исправить это поведение?

+0

Если у вас нет привязки FindAncestor? вроде этого. Muds

+0

Вы правы, чего не хватает. Однако, по-видимому, это значение по умолчанию, так как оно работает без него, и добавление его не имеет значения. – UrbanEsc

+0

О, хорошо, я вижу это в первом взгляде и думал, что это может быть полезно иметь на месте! – Muds

ответ

0

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

+0

Обмен вам кодом может быть полезным для некоторых .. – Muds

+0

Мысль об этом, но это просто еще одна привязка, но свойство на ViewModelB. Кроме того, это действительно не решает проблему, а обойти ее. – UrbanEsc