Eu estou usando um WPF RelativeSource
Binding
em um DataTemplate
para uma das minhas aulas de ViewModel, assim:
<DataTemplate x:Type="{x:Type ViewModelB}">
<Grid Visibility="{Binding DataContext.MyBoolProperty,
RelativeSource={RelativeSource AncestorType=ContentControl},
Converter={StaticResource BooleanToVisibilityConverter}}">
</Grid>
</DataTemplate>
A ViewModel raiz, ViewModelA
, Tem uma instância dessa ViewModel como uma propriedade pública, e também tem um DataTemplate
para ele, como este:
<DataTemplate x:Type="{x:Type ViewModelA}">
<ContentPresenter Content="{Binding ViewModelBProperty}" />
</DataTemplate>
Como você vê, eu quero alguma coisa na vista por ViewModelB
sendo acionado Visible
ou Hidden
com base em uma propriedade que está no ViewModelA
.
Esta abordagem funciona bem.
Contudo, ViewModelA
em si também é apresentado em ContentPresenter
. Quando altero o conteúdo deste ContentPresenter
(por exemplo, para ViewModelC
), Eu sou presenteado com algumas exceções de ligação no meu log de depuração, tais como:
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")
Eu estou supondo aqui, que o Binding
ao DataContext é atualizado antes do ponto de vista real é descartado. O que pode ser feito para corrigir esse comportamento?
Respostas:
0 para resposta № 1Acabei de corrigir este código, a reescrita daalltogether lógica de ligação. A ligação já não é dependend em uma propriedade de ViewModelA. Ainda estaria interessado em saber como se pode resolver tal problema a.