使用Wpf RelativeSource绑定会破坏可混合性

使用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

我有下面的场景。。。我有一个包含ItemsControl的窗口。我为窗口的DataContext指定了一个ViewModel。我为ItemControl的ItemTemplate指定了一个DataTemplate。在DataTemplate中,我使用ComboBox,对于ComboBox的ItemsSource,我使用RelativeSource绑定到其包含窗口的DataContext。在运行时,一切正常,绑定得到正确解析,但在设计时,Cider无法拾取ItemSource绑定到的包含窗口的ViewModel

下面是我的代码(我在顶部遗漏了xml名称空间声明,但在我的代码中包含了它们):


因此,从上面的代码来看,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>