WPF:将DataGridTemplateColumn中的元素绑定到另一个DataGridTemplateColumn中的元素

时间:2017-06-20 10:44:21

标签: c# wpf xaml binding datagrid

:)我有一个DataGrid。在Column2中有#34; ComboBox1",在Column3中有" ComboBox2"。我想在" ComboBox2"上设置IsEnabled为false。只要" ComboBox1"具有SelectedIndex = 0。对于每一行分开。

这在Datagrid外部完美地工作,有两个ComboBoxes(在Style和DataTrigger的帮助下)。但是,在Datagrid中,在Column3中我不能"看到" " ComboBox1" ("无法找到绑定源......")。

它基本上是一个名人范围问题。但是,首先在DataGrid中引用一个Combobox似乎是错误的。那么:任何想法如何实现这个目标?

非常感谢你!

<Window.Resources>
    <CollectionViewSource x:Key="Source1" Source="{Binding List1}" />
    <CollectionViewSource x:Key="Source2" Source="{Binding List2}" />
</Window.Resources>

<DataGrid x:Name="ModelControl" AutoGenerateColumns="False" ItemsSource="{Binding List3}">
    <DataGrid.Columns>
         <DataGridTextColumn Binding="{Binding MyName}" Header="Modellname" />
        <DataGridTemplateColumn Header="Header 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="ComboBox1" DisplayMemberPath="MyName" SelectedIndex="0">
                        <ComboBox.ItemsSource>
                            <CompositeCollection>
                                <CollectionContainer Collection="{Binding Source={StaticResource Source2}}" />
                            </CompositeCollection>
                        </ComboBox.ItemsSource>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Header 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName">
                        <ComboBox.Style>
                            <Style TargetType="{x:Type ComboBox}">
                                <Setter Property="IsEnabled" Value="True" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding SelectedIndex,ElementName=ComboBox1}" Value="0">
                                        <Setter Property="IsEnabled" Value="False" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ComboBox.Style>
                        <ComboBox.ItemsSource>
                            <CompositeCollection>
                                <CollectionContainer Collection="{Binding Source={StaticResource Source1}}" />
                            </CompositeCollection>
                        </ComboBox.ItemsSource>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

请不要介意CompositeCollection。

2 个答案:

答案 0 :(得分:1)

  

然而,首先在名称中引用DataGrid中的Combobox似乎是错误的。那么:任何想法如何实现这个目标?

您应该将SelectedIndex属性绑定到模型类的source属性:

<DataGrid x:Name="ModelControl" AutoGenerateColumns="False" ItemsSource="{Binding List3}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding MyName}" Header="Modellname" />
        <DataGridTemplateColumn Header="Header 1">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="ComboBox1" DisplayMemberPath="MyName" 
                                      SelectedIndex="{Binding YourIndexProperty}">
                        <ComboBox.ItemsSource>
                            <CompositeCollection>
                                <CollectionContainer Collection="{Binding Source={StaticResource Source2}}" />
                            </CompositeCollection>
                        </ComboBox.ItemsSource>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Header 2">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName">
                        <ComboBox.Style>
                            <Style TargetType="{x:Type ComboBox}">
                                <Setter Property="IsEnabled" Value="True" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding YourIndexProperty}" Value="0">
                                        <Setter Property="IsEnabled" Value="False" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ComboBox.Style>
                        <ComboBox.ItemsSource>
                            <CompositeCollection>
                                <CollectionContainer Collection="{Binding Source={StaticResource Source1}}" />
                            </CompositeCollection>
                        </ComboBox.ItemsSource>
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

确保模型类型实现INotifyPropertyChanged接口并在setter中引发PropertyChanged事件:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

答案 1 :(得分:0)

尝试这样的事情:

通过添加选定的ID SelectedValue="{Binding List3ComboBox1ItemId}"修改您的组合框1,List3ComboBox1ItemId属性必须是list3的属性

<ComboBox x:Name="ComboBox1" DisplayMemberPath="MyName" SelectedValue="{Binding List3ComboBox1ItemId}">
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <CollectionContainer Collection="{Binding Source={StaticResource Source2}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

和你的combobox2你必须包含一个转换器来验证你的身份,如果id&gt; 0返回true。 (不包括在这个答案中)

<ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName" SelectedItem="{Binding List3ComboBox2Item}"  IsEnabled={Binding List3ComboBox1ItemId, Converter={StaticResource IntegerToBoolConverter}} >