WPF中的主细节绑定

Cor*_*One 1 data-binding wpf

为什么我在这个例子中没有看到细节.我无法改变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)

Cle*_*ens 5

尝试

<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大小写,例如类和属性.

  • 请注意Pascal外壳的评论. (2认同)