wpf - DataGrid - 使用 MVVM 绑定(bind)到列表列表

标签 wpf mvvm binding datagrid

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

个人.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");
    }
  }
}

项目.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>

查看模型.cs
    private ObservableCollection<Person> _persons = new ObservableCollection<Person>();

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

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

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

感谢您的任何帮助

最佳答案

创建一个跟踪当前选择的 View 模型类 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; }
}

设置DataContextTabControl ,或其父窗口,到此 View 模型类的一个实例:
tc.DataContext = new ViewModel();

并绑定(bind)到 View 模型属性:
<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>

关于wpf - DataGrid - 使用 MVVM 绑定(bind)到列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44304610/

相关文章:

wpf - 设置 WPF/XAML 窗口客户区大小

c# - 在 DataGrid 上绑定(bind) View 和 ViewModel

wpf - 如何显示在WPF(MVVM)中单击确定并单击取消的对话框?

c# - 带有保存按钮的 WinForms 数据绑定(bind)?

c# - 如何对按钮 WPF 进行分组?

c# - 在另一个线程上继续执行代码

c# - 当 AutoGenerateColumns 设置为 True 时,如何停止在 DataGrid 中生成特定列?

c# - 控件应该在 ViewModel 中吗?

silverlight - 如何将 ValueConverter 应用于基于约定的 Caliburn.Micro 绑定(bind)?

c# - 何时评估 XAML 绑定(bind)?