WPF中的主细节绑定

时间:2012-02-11 16:07:06

标签: wpf data-binding

为什么我在这个例子中看不到细节。我无法改变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; }
}

在我的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>

1 个答案:

答案 0 :(得分:5)

尝试

<ItemsSource="{Binding Path=data.details}">

而不是

<ItemsSource="{Binding Path=data/details}">

我认为你试图实现的是一种主/细节场景,它绑定到How to: Use the Master-Detail Pattern with Hierarchical Data中描述的分层数据。实际上,只要你有ObservableCollection<details>作为派生自ObservableCollection<master>的类的属性,这就不是分层的,因此绑定表达式中的/将不起作用。有关/的详细信息,请参阅PropertyPath XAML Syntax源遍历(绑定到集合的层次结构)部分。

在C#中,capitalization也有广泛接受的约定,说你应该在公共类型中使用Pascal大小写,例如类和属性。