使用Wpf RelativeSource绑定会破坏可混合性
我有下面的场景。。。我有一个包含ItemsControl的窗口。我为窗口的DataContext指定了一个ViewModel。我为ItemControl的ItemTemplate指定了一个DataTemplate。在DataTemplate中,我使用ComboBox,对于ComboBox的ItemsSource,我使用RelativeSource绑定到其包含窗口的DataContext。在运行时,一切正常,绑定得到正确解析,但在设计时,Cider无法拾取ItemSource绑定到的包含窗口的ViewModel 下面是我的代码(我在顶部遗漏了xml名称空间声明,但在我的代码中包含了它们):使用Wpf RelativeSource绑定会破坏可混合性,wpf,binding,relativesource,blendability,Wpf,Binding,Relativesource,Blendability,我有下面的场景。。。我有一个包含ItemsControl的窗口。我为窗口的DataContext指定了一个ViewModel。我为ItemControl的ItemTemplate指定了一个DataTemplate。在DataTemplate中,我使用ComboBox,对于ComboBox的ItemsSource,我使用RelativeSource绑定到其包含窗口的DataContext。在运行时,一切正常,绑定得到正确解析,但在设计时,Cider无法拾取ItemSource绑定到的包含窗口的Vi
因此,从上面的代码来看,Path=DataContext.availablegnres在设计时无法解析,但在运行时它被正确解析
有人知道我是否做错了什么,还是Wpf xaml解析器在设计时无法解析到相对资源的绑定是个问题?我知道这是个老问题,但为了子孙后代,我有一个适合我的解决方案 我从未能够使相对资源绑定成为可混合的。但是,如果您有幸拥有一个没有绑定集的祖先,则可以向设计时环境提供标志柱 在备用祖先(本例中为网格)上,将DataContext绑定到相同的RelativeSource,但路径设置为仅DataContext的除外。然后,将d:DataContext应用于同一个祖先,为其提供要在实际原始元素上绑定到的类型(或等效的mock)。最后,按照法线将原始元素(组合框)绑定到属性或路径
<Grid
DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}, Path=DataContext,
Mode=OneWay}"
d:DataContext="{Binding Source={StaticResource DesignViewModel}}" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="20"></ColumnDefinition>
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" Margin="3,0,3,0"
ItemsSource="{Binding Path=AvailableGenres, Mode=OneWay}"
DisplayMemberPath="Name"
SelectedItem="{Binding Path=Genre, Mode=TwoWay}" DataContext="
{Binding}" />
</Grid>
创建设计时数据的能力,这样设计师就可以进行设计了。。。
<Grid
DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}, Path=DataContext,
Mode=OneWay}"
d:DataContext="{Binding Source={StaticResource DesignViewModel}}" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="20"></ColumnDefinition>
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" Margin="3,0,3,0"
ItemsSource="{Binding Path=AvailableGenres, Mode=OneWay}"
DisplayMemberPath="Name"
SelectedItem="{Binding Path=Genre, Mode=TwoWay}" DataContext="
{Binding}" />
</Grid>