2

我有以下场景......我有一个包含 ItemsControl 的窗口。我为 Window 的 DataContext 指定了一个 ViewModel。我为 ItemControl 的 ItemTemplate 指定了一个 DataTemplate。在 DataTemplate 中,我使用 ComboBox,对于 ComboBox 的 ItemsSource,我使用 RelativeSource 绑定到其包含的 Window 的 DataContext。在运行时一切正常并且绑定被正确解析,但在设计时苹果酒无法获取 ItemSource 绑定到的包含窗口的 ViewModel。

这是我的代码(我在顶部省略了 xml 命名空间声明,但在我的代码中它们包含在内):

<Window d:DataContext="{Binding Source={StaticResource DesignViewModel}}">

<Window.Resources>
    <designviewmodels:GenresEditorDesignViewModel x:Key="DesignViewModel" />
</Window.Resources>

<ItemsControl Grid.Row="0"  Margin="3" ItemsSource="{Binding Path=CurrentState}" >
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Grid DataContext="{Binding}">
            <Grid.ColumnDefinitions>
               <ColumnDefinition Width="*"></ColumnDefinition>
               <ColumnDefinition Width="20"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <ComboBox Grid.Column="0" Margin="3,0,3,0" 
                ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,  
                AncestorType={x:Type Window}}, Path=DataContext.AvailableGenres, 
                Mode=OneWay}"
                DisplayMemberPath="Name" 
                SelectedItem="{Binding Path=Genre, Mode=TwoWay}" DataContext=" 
                {Binding}" />

                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

所以基本上从上面的代码中 Path=DataContext.AvailableGenres 在设计时无法解析,但在运行时它被正确解析。

有谁知道我做错了什么,或者是 Wpf xaml 解析器的问题,它在设计时无法解析到 RelativeSources 的绑定?

4

1 回答 1

1

我知道这是一个老问题,但为了后代,我有一个适合我的解决方案。

我从来没有能够让 RelativeSource 绑定成为可混合的。但是,如果您有幸拥有一个没有针对它的绑定设置的祖先,您可以向设计时环境提供路标。

在备用祖先(在本例中为 Grid)上,将 DataContext 绑定到相同的 RelativeSource ,Path 仅设置为 DataContext。然后,将 ad:DataContext 应用到同一个祖先,为它提供您想要绑定到实际原始元素的类型(或等效模拟)。最后,按照正常方式将您的原始元素(组合框)绑定到属性或路径。

<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>
于 2013-06-06T03:45:49.800 回答