【问题标题】:DataGrid - Binding to a list of lists with MVVMDataGrid - 使用 MVVM 绑定到列表列表
【发布时间】:2017-06-01 10:06:38
【问题描述】:

我有一个可以包含项目列表的“Person”类。

Person.cs

public class Person : ObservableObject
{
  private string _id;
  public string Id
  {
    get { return _id; }
    set
    {
      _id = value;
      RaisePropertyChangedEvent("Id");
    }
  }

  ...

  Private IList<Item> _items;
  public IList<Item> Items
  {
    get { return _items; }
    set
    {
      _items = value;
      RaisePropertyChangedEvent("Items");
    }
  }
}

Item.cs

public class Item : ObservableObject
{
  private string _id;
  public string Id
  {
    get { return _id; }
    set
    {
      _id = value;
      RaisePropertyChangedEvent("Id");
    }
  } 

  ...
}

我正在尝试在选项卡式数据网格中显示它。第一个选项卡是“Person”,第二个选项卡是“Items”。

.XAML

    <Window.DataContext>
      <viewModels:PersonViewModel />
    </Window.DataContext>

    <TabControl>
        <TabItem Header="Person">
            <DataGrid ItemsSource="{Binding Person}" Width="1700" Height="800" AutoGenerateColumns="False" CanUserAddRows="false"
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" RowHeight="20">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Id" Binding="{Binding Id}" IsReadOnly="True"/>
                    ...
                </DataGrid.Columns>
            </DataGrid>
         </TabItem>

        <TabItem Header="Items">
            <DataGrid ItemsSource="{Binding Person.Items}" Width="1700" Height="800" AutoGenerateColumns="False" CanUserAddRows="false"
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" RowHeight="20">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Person Id" Binding="{Binding Person.Id}" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Id" Binding="{Binding Id}" IsReadOnly="True"/>
                    ...
                </DataGrid.Columns>
            </DataGrid>
        </TabItem>
    </TabControl>

查看 Model.cs

    private ObservableCollection<Person> _persons = new ObservableCollection<Person>();

public ObservableCollection<Person> Person
{
  get { return _persons; }
  set
  {
    _persons = value;
    RaisePropertyChangedEvent("Person");
  }
}

这是我所知道的。我假设我需要以某种方式遍历 Person 对象,然后执行 Person.Items 但不确定。

我能够完美地显示我的“Person”对象,这只是我遇到问题的“Items”选项卡。我收到错误“无法解析 ObservableCollection 类型的数据上下文中的属性“项目””

感谢您的帮助

【问题讨论】:

  • 您的意思是主从视图还是所有Items 和所有Persons 都应该出现在第二个选项卡中?
  • 你好 dymanoid,我只想让所有 Persons 的所有项目都出现在第二个选项卡中。第二个选项卡的第一列是对人员 ID 的引用
  • 您在第一个 DataGrid 中看到任何人吗? TabControl的DataContext是什么?
  • 我正确绑定到我的 ViewModel 并显示 person 对象。已将此代码添加到原始问题中。谢谢

标签: wpf mvvm binding datagrid


【解决方案1】:

创建一个视图模型类来跟踪当前选定的Person 以及所有要显示在第一个DataGrid 中的人:

public class ViewModel : ObservableObject
{
    public ViewModel()
    {
        Persons = new ObservableCollection<Person>();
        //populate your collection here...
        Persons.Add(new Person() { });
        //...
    }

    private Person _selectedPerson;
    public Person SelectedPerson
    {
        get { return _selectedPerson; }
        set
        {
            _selectedPerson = value;
            RaisePropertyChangedEvent("SelectedPerson");
        }
    }

    public ObservableCollection<Person> Persons { get; private set; }
}

将TabControl 或其父窗口的DataContext 设置为此视图模型类的实例:

tc.DataContext = new ViewModel();

并绑定到视图模型属性:

<TabControl x:Name="tc">
    <TabItem Header="Person">
        <DataGrid ItemsSource="{Binding Persons}"
                          SelectedItem="{Binding SelectedPerson}"
                          Width="1700" Height="800" AutoGenerateColumns="False" CanUserAddRows="false"
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" RowHeight="20">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}" IsReadOnly="True"/>
            </DataGrid.Columns>
        </DataGrid>
    </TabItem>

    <TabItem Header="Items">
        <DataGrid ItemsSource="{Binding SelectedPerson.Items}" Width="1700" Height="800" AutoGenerateColumns="False" CanUserAddRows="false"
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" RowHeight="20">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Person Id" Binding="{Binding Person.Id}" IsReadOnly="True"/>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}" IsReadOnly="True"/>
            </DataGrid.Columns>
        </DataGrid>
    </TabItem>
</TabControl>

【讨论】:

  • 谢谢!但是,我只想显示所有内容,所以没有 SelectedPerson。我已经实现了这个,但是 SelectedPerson 代码永远不会被命中并且项目没有被填充
  • 您是否绑定到 XAML 中的 SelectedPerson 属性? SelectedItem="{绑定 SelectedPerson}"
  • 谢谢。我使用上面的答案得到了这个工作
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 2013-08-06
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多