【问题标题】:ComboBox in datagrid not updated数据网格中的组合框未更新
【发布时间】:2014-03-21 17:05:00
【问题描述】:

我有一个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();
            }

【问题讨论】:

  • 更新代码中的Entities 来自哪里?它与您在初始化代码中设置为 ItemsSource 的实例相同吗?
  • 感谢您的评论。你在正确的道路上提到了实例。问题是我创建了一个新的域实例,我的猜测是它使新对象不等于组合框 itemsource 中的对象。

标签: c# wpf datagrid combobox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

    • 将列表更改为 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>
      

    因为 Domain 对象有很多属性,您应该将选定的值设置为 Domain 对象的主键,并将 displaymemberpath 设置为您要显示的值 - 我认为在您的情况下是域名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多