【问题标题】:WPF: Binding an Element in a DataGridTemplateColumn to an Element in another DataGridTemplateColumnWPF:将 DataGridTemplateColumn 中的元素绑定到另一个 DataGridTemplateColumn 中的元素
【发布时间】:2017-11-22 20:52:32
【问题描述】:

:) 我有一个 DataGrid。在 Column2 中有“ComboBox1”,在 Column3 中有“ComboBox2”。只要“ComboBox1”的 SelectedIndex=0,我想在“ComboBox2”上将 IsEnabled 设置为 false。分别为每一行。

这在带有两个 ComboBox 的 Datagrid 之外完美地工作(在 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。

【问题讨论】:

    标签: c# wpf xaml binding datagrid


    【解决方案1】:

    但是,首先在 DataGrid 中按名称引用 Combobox 似乎是错误的。那么:有什么想法可以做到这一点吗?

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

    <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

    【讨论】:

    • 谢谢!模型类是两个 ComboBox 的共同点——完美!我试图通过 DependencyProperty(而不是 INotifyPropertyChanged)来做到这一点。由于某种原因没有工作,直到我另外通过组合框的 DropDownClosed 属性引发了一个事件,该属性设置了模型 DependencyProperty。现在完美运行! :-)
    【解决方案2】:

    试试这样的:

    通过添加选定的 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>
    

    如果 id > 0 返回 true,则您的组合框 2 必须包含一个转换器来验证您的 id。 (不包括在这个答案中)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2012-04-21
      • 2018-02-11
      • 1970-01-01
      • 2012-10-13
      • 2011-02-06
      • 1970-01-01
      相关资源
      最近更新 更多