C# WPF MVVM ItemSource 没有附加列表

C# WPF MVVM ItemSource not attaching list

我有一个 Roles 的列表,我想在 DataGrid 单元格 ComboBox 中进行选择。

我有 ObservableCollection Roles 用于在 ViewModel 中填充的 ComboBox

由于某种原因,ComboBox 中没有显示任何内容。附加此对象集合的正确方法是什么?

任何意见或建议都会有所帮助。


人物模型:

public int SelectedRole { get; set; }

角色模型:

public int Id { get; set; }

public int Role { get; set; }

public string Description { get; set; }

public string RoleInfo 
{ 
    get 
    {
        return $"{Role} - {Description}";
    }  
}

ViewModel:

private ObservableCollection<PersonModel> _people;
public ObservableCollection<PersonModel> People
{
    get { return _people; }
    set
    {
        _people = value;
        NotifyOfPropertyChange(() => People);
    }
}

public ObservableCollection<RoleModel> _roles;
public ObservableCollection<RoleModel> Roles
{
    get
    {
        return _roles;
    }
    set 
    {
        _roles = value;
        NotifyOfPropertyChange(() => Roles);
    }
}

public PersonViewModel(IEventAggregator events, IWindowManager windowmanager)
{
    _events = events;
    _windowManager = windowmanager;

    sql = "SELECT * FROM People";
    People = SqliteConnector.LoadData<PersonModel>(sql, new Dictionary<string, object>());
    sql = "SELECT * FROM Roles";
    Roles = SqliteConnector.LoadData<PersonModel>(sql, new Dictionary<string, object>());
}

查看:

<DataGrid ItemsSource="{Binding Path=People}"
          AutoGenerateColumns="False"
          CanUserDeleteRows="True"
          CanUserReorderColumns="True"
          CanUserAddRows="True"
          AlternatingRowBackground="#dfdfdf"
          cm:Message.Attach="[Event RowEditEnding] = [Action SaveOrUpdate()]">
  <DataGridTemplateColumn Header="Type">
    <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
        <TextBlock Text="{Binding Path=Role}"/>
      </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
      <DataTemplate>
        <ComboBox DisplayMemberPath="RoleInfo"
                  ItemsSource="{Binding Path=Roles}"
                  SelectedValue="{Binding Path=SelectedRole, UpdateSourceTrigger=PropertyChanged}"
                  SelectedValuePath="Role" />
      </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
  </DataGridTemplateColumn>
</DataGrid>

DataGrid 的“行”元素的 DataContext 是 ItemsSource 集合的对应项,即 PersonModel 实例 - 当然没有 Roles 属性。您应该已经在 Visual Studio.

中的输出 Window 中观察到相应的数据绑定错误消息

为了绑定到父视图模型的角色 属性,使用如下表达式:

ItemsSource="{Binding DataContext.Roles,
                      RelativeSource={RelativeSource AncestorType=DataGrid}}"

SelectedValue 绑定可以简单地如下所示,因为 PropertyChanged 已经是 属性.

的默认值 UpdateSourceTrigger
SelectedValue="{Binding Path=SelectedRole}"

当您 运行 您的程序时,请检查输出 window 以准确了解该控件在加载时出现了何种错误。这将使您更好地了解抛出的异常类型。我的猜测是 ComboBox 的 ItemsSource 正在您的 Person 模型中寻找 ObservableCollection Roles,并且抛出异常,因为 Roles 仅在您的 ViewModel 中。尝试将此集合移动到 Person Model 并通过 Person Model 构造函数为其分配初始值。