2017-06-01 189 views
0

我有一個'Person'類,它可以有一個Items列表。DataGrid - 綁定到MVVM列表的列表

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」選項卡。我得到的錯誤「中的DataContext類型的ObservableCollection的‘’無法解決財產」的相關文件

感謝您的幫助

+0

你的意思是一個主詳細視圖或應該都是'Item's所有'Person's出現在第二個選項卡? – dymanoid

+0

你好dymanoid,我只想讓所有人都出現在第二個標籤中。第二個選項卡的第一列是對人員的引用Id –

+0

您是否在第一個DataGrid中看到任何人?什麼是TabControl的DataContext? – mm8

回答

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> 
+0

謝謝!但是,我只想顯示所有內容,因此沒有SelectedPerson。我已經實現了這一點,但SelectedPerson代碼從未被擊中,並且項目未被填充 –

+0

您綁定了XAML中的SelectedPerson屬性嗎? SelectedItem =「{Binding SelectedPerson}」 – mm8

+0

謝謝。我使用上面的答案得到了這個工作 –