1

在我的 xaml 文件中,我有:

<DataTemplate DataType="{x:Type Configuration:Drivers}">
    <ItemsControl ItemsSource="{Binding Cars}" FontWeight="Normal" />   
<DataTemplate>

<DataTemplate DataType="{x:Type Configuration:Car}">
    <UniformGrid HorizontalAlignment="Stretch" Margin="5,1,5,2" Columns="2">                                              
         <CheckBox IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>    
         <CheckBox Visibility="{Binding SaveImage, UpdateSourceTrigger=PropertyChanged}"/>
    </UniformGrid>      
</DataTemplate>   

对于每辆车,它都有: Enabled 属性,但没有 SaveImage 属性。

Car
{
   public bool Enabled {}
}

'SaveImage' 是全局设置的。我不知道如何绑定:DataTemplate 中的 bool SaveImage?

4

3 回答 3

2

DataTemplates是一个封装边界,因此您不能总是使用它FindAncestor来获取所需的数据。一个好的解决方案是将您ViewModel的 XAML 作为 aStaticResource然后将DataContext您的LayoutRoot网格设置为 this StaticResource,然后所有其他 DataTemplates 都可以DataContext通过相同的方式访问StaticResource

例子

<Window.Resources>
    <local:MyViewModel x:Key="viewmodel" />
    <DataTemplate DataType="{x:Type Configuration:Car}">
        <UniformGrid HorizontalAlignment="Stretch" Margin="5,1,5,2" Columns="2">
            <CheckBox IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>
            <CheckBox Visibility="{Binding Source={StaticResource viewmodel}, 
                Path=SaveImage, UpdateSourceTrigger=PropertyChanged}"/>
        </UniformGrid>
    </DataTemplate>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource viewmodel}}">

</Grid>
于 2012-06-15T10:08:28.517 回答
0

如果SaveImage在 中可用,DataContextItemsControl可以通过这种方式绑定到它:

<CheckBox IsChecked="{Binding DataContext.SaveImage, UpdateSourceTrigger=PropertyChanged,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"/>
于 2012-06-15T08:34:00.197 回答
0

解决方案1:可以尝试RelativeSource将IsCheck绑定到abcestor对象。

{Binding Path=SaveImage, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}

解决方案2:将属性SaveImage添加到视图模型类Car并引用模型SaveImage。这不是一个好的解决方案。

于 2012-06-15T08:41:51.830 回答