数据网格中的组合框未更新

本文关键字:更新 组合 数据网 网格 数据 | 更新日期: 2023-09-27 17:51:12

我有一个显示对象列表的DataGrid。对象中的一个属性是另一个自定义对象。该对象在网格中显示为ComboBox。当我从网格中更改ComboBox中选定的项目时,一切似乎都如我预期的那样工作。但是,当我从后面的代码更改所选项目时,ComboBox中的SelectedItem不更新。我已经实现了INotifyPropertyChanged,事件正在触发,因为它应该。我也尝试在TextBox中打印域名,它显示了正确的值。我的问题是,SelectedItemBinding似乎不工作,当我从后面的代码更新。有人能解释一下原因吗?下面是我的代码:

XAML

    <DataGrid AutoGenerateColumns="False" Height="506" HorizontalAlignment="Left" Name="EntityGrid" VerticalAlignment="Top" Width="360" Margin="10,62,0,0">
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridCell}">
                <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown" />
                <EventSetter Event="PreviewTextInput" Handler="DataGridCell_PreviewTextInput" />
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding dbName, Mode=TwoWay}" />
            <DataGridComboBoxColumn x:Name="Domain" Header="Domain"  SelectedItemBinding="{Binding Domain, Mode=TwoWay}" DisplayMemberPath="DomainName}"/>
            <DataGridCheckBoxColumn Header="Static" Binding="{Binding Static}" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>

我的对象
 public class Entity : INotifyPropertyChanged
{
    private string _dbName;
    public string dbName { get { return _dbName; } set { _dbName = value; NotifyPropertyChanged("dbName"); } }
    public string EntityName { get; set; }
    private Domain _domain;
    public Domain Domain
    {
        get { return _domain; }
        set
        {
            _domain = value;
            NotifyPropertyChanged("Domain");
        }
    }
    public bool Static { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
public class Domain : INotifyPropertyChanged
{
    public string DomainName { get; set; }
    public string ContextName { get; set; }
    public string FileName { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

初始化代码
            List<Domain> domains = getDomainsFromConfig();
        List<Entity> Entities = dal.getAllEntities(config.Paths.dbml.AllEntities, config.Paths.dbml.LockedEntities);
        EntityGrid.ItemsSource = Entities;
        Domain.ItemsSource = domains;

更新代码
foreach (Entity entity in Entities)
            {
                entity.Domain = getDefaultDomain();
            }

数据网格中的组合框未更新

头痛几个小时后解决了问题。在我的更新代码中,我创建了Domain的一个新实例。我的猜测是,它使它不等于当前项目源中的对象。我对这个问题的解决方案是从原始的Domain ItemSource中选择Domain,然后将其分配给Entity。

try this:

  • 将列表更改为ObservableCollection

    List<Domain> to ObservableCollection<Domain>
    
  • 将组合框更改为

    <DataGrid>
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="domain">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox SelectedValue="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
    

由于域对象有许多属性,您应该将所选值设置为域对象的主键,并将displaymemberpath设置为您想要显示的值-我认为在您的情况下是域名。