WPF数据绑定将文本块文本链接到组合框选择

时间:2018-05-18 19:00:11

标签: wpf vb.net data-binding

我的数据网格中有这个xaml:

                <DataGridTemplateColumn Header="Status" Width="*" IsReadOnly="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="StatusText" Text="{Binding Description}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ComboBox 
                            ItemsSource="{Binding Source={StaticResource StatusItems}}"
                            SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
                            DisplayMemberPath="Description"
                            SelectedValuePath="Status"
                            x:Name="Combo"
                            />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

当我更改组合框的值时,数据集会完美更新,但文本块文本不会更新为新值我必须重新填充文本块的整个数据集以匹配新选择的组合框值。我看到正确的方法是实现INotifyPropertyChanged,但这需要对应用程序填充数据集的方式进行重大更改,至少从我理解阅读类似帖子的方式来看。我没有可以实现的模型,我想知道我是否可以在文本块上设置触发器,只要组合框选择发生变化就会改变值。

以下是我如何填充数据网格,如果有人知道如何修改它来实现INotifyPropertyChanged,这也会很棒,但我认为没有定义模型就能工作(再次,只是去在我看到别人做的事情上。)

Dim con As New SqlConnection(str)
Dim ds As New DataSet()
Dim Adpt As New SqlDataAdapter
Adpt.SelectCommand = New SqlCommand(com, con)

    con.Open()

    Adpt.Fill(ds, "dbo.tmfCNCComponent_threed")
    dataGrid1.ItemsSource = ds.Tables("dbo.tmfCNCComponent_threed").DefaultView


    con.Close()

1 个答案:

答案 0 :(得分:1)

将此属性添加到ComboBox:IsSynchronizedWithCurrentItem="False"。默认情况下,CollectionViewSource会跟踪选择器中的所选项目(例如,ComboBox,ListBox等)。如果对多个控件使用相同的CollectionViewSource,除非您明确禁止,否则它将对所有控件施加相同的选择。如果您使用具有多个选择器的相同集合,则有时您希望它们全部同步所选项目。这不是其中之一。

您需要一个只读的CellTemplate和一个可编辑的CellEditingTemplate。我们可以为两者使用相同的模板,其中ComboBox在未编辑单元格时被禁用。

结果:

<DataGrid x:Name="DataGrid" AutoGenerateColumns="False" CellEditEnding="DataGrid_CellEditEnding">
    <DataGrid.Resources>
        <DataTemplate x:Key="StatusColumnTemplate">
            <ComboBox 
                ItemsSource="{Binding Source={StaticResource StatusItems}}"
                SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}"
                DisplayMemberPath="Description"
                SelectedValuePath="Status"
                IsSynchronizedWithCurrentItem="False"
                IsEnabled="{Binding IsEditing, RelativeSource={RelativeSource AncestorType=DataGridCell}}"
                />
        </DataTemplate>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn 
            Header="Status Shared"
            CellTemplate="{StaticResource StatusColumnTemplate}"
            CellEditingTemplate="{StaticResource StatusColumnTemplate}"
            />

您现在所拥有的内容显然无法正常工作,因为网格行没有 Description列。

NotifyOnSourceUpdated=True与此处发生的任何事情无关。