代码之家  ›  专栏  ›  技术社区  ›  knutter539

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

  •  0
  • knutter539  · 技术社区  · 6 年前

    我的数据网格中有这个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>
    

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

    下面是我如何填充datagrid的,如果有人知道我可以如何修改它来实现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 回复  |  直到 6 年前
        1
  •  1
  •   15ee8f99-57ff-4f92-890c-b56153    6 年前

    将此属性添加到组合框: IsSynchronizedWithCurrentItem="False" .默认情况下, CollectionViewSource 跟踪选择器中的选定项(例如组合框、列表框等)。如果您使用相同的 集合视图源 对于多个控件,除非您明确禁止,否则它将对所有控件施加相同的选择。如果将同一集合与多个选择器一起使用,则在某些情况下,您希望所有选择器都同步所选项目。这不是那种情况。

    您需要一个只读的CellTemplate和一个可编辑的CellEditingTemplate。我们可以对两者使用相同的模板,在不编辑单元格时禁用一个组合框。

    结果:

    <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}"
                />
    

    您现在得到的显然无法工作,因为网格行不工作 A. Description

    NotifyOnSourceUpdated=True 与这里发生的事情无关。