为什么我在这个例子中没有看到细节.我无法改变dataclass,master类和detail类的结构.所以我必须用正确的绑定来解决这个问题.
public class ViewModel
{
public dataclass data { get; set; }
public ViewModel()
{
data = new dataclass();
master a_master = new master();
a_master.mastername = "hello";
detail a_detail = new detail();
a_detail.detailname = "goodbye";
data.details.Add(a_detail);
data.Add(a_master);
}
}
public class dataclass : ObservableCollection<master>
{
public ObservableCollection<detail> details { get; set; }
public dataclass()
{
details = new ObservableCollection<detail>();
}
}
public class master
{
public string mastername { get; set; }
}
public class detail
{
public string detailname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的XAML中,我这样绑定:
<Window x:Class="md.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:md.viewmodels"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:ViewModel/>
</Window.DataContext>
<StackPanel Orientation="Vertical" >
<ListView ItemsSource="{Binding Path=data}">
<ListView.View>
<GridView>
<GridViewColumn Header="master" DisplayMemberBinding="{Binding mastername}"/>
</GridView>
</ListView.View>
</ListView>
<ListView ItemsSource="{Binding Path=data/details}">
<ListView.View>
<GridView>
<GridViewColumn Header="detail" DisplayMemberBinding="{Binding detailname}"/>
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
尝试
<ItemsSource="{Binding Path=data.details}">
Run Code Online (Sandbox Code Playgroud)
代替
<ItemsSource="{Binding Path=data/details}">
Run Code Online (Sandbox Code Playgroud)
我认为你试图实现的是一种主/细节场景,它绑定到分层数据,如" 如何:使用主 - 细节模式和层次数据"中所述.实际上,只要你有一个ObservableCollection<details>派生自ObservableCollection<master>此类的属性不是分层的,因此/绑定表达式中的属性将不起作用.有关详细信息,请参阅PropertyPath XAML语法," 源遍历(绑定到集合的层次结构) "部分/.
在C#中也有广泛接受的大写公约,说你应该在公共类型中使用Pascal大小写,例如类和属性.