我无法在WPF中同步Master / Detail ListBox

时间:2012-02-15 00:43:53

标签: c# wpf listbox dataset master-detail

我在WPF中同步两个ListBox时遇到了一些问题。

我已经使用两个DataTable创建并填充了一个DataSet。一个DataTable适用于People,另一个DataTable适用于他们的照片。

我可以让两个ListBox彼此独立地运行,但我希望它们可以作为Master to Detail。

这是我的第一个WPF项目,所以非常感谢任何建议!

C#CODE:

DataSet ds = new DataSet();
UserManagement.Users users = new UserManagement.Users(_cnFaces);
ds = users.GetUsersForFR();
users = null;
lbPeople.DataContext = ds;
lbPhotos.DataContext = ds;

    public DataSet GetUsersForFR()
    {
        Library.DAL.DataCE helper;
        try
        {
            string sSQLPeople = @"
                    SELECT 
                         *
                    FROM 
                        tblUsers
                    ";

            string sSQLPhotos = @"
                    SELECT 
                         *
                    FROM 
                        tblFacialRecognition
                    ";

            helper = new Library.DAL.DataCE(_cnFaces);
            DataSet ds = new DataSet();
            ds.Tables.Clear();
            ds.Tables.Add(helper.GetDataTable(sSQLPeople, CommandType.Text, "People"));
            ds.Tables.Add(helper.GetDataTable(sSQLPhotos, CommandType.Text, "Photos"));

            DataRelation relation = new DataRelation("People2Photos",
                ds.Tables["People"].Columns["fldUsername"],
                ds.Tables["Photos"].Columns["fldUsername"]);
            ds.Relations.Add(relation);

            return ds;
        }
        finally
        {
            helper = null;
        }
    }

的DataTemplates:

<DataTemplate x:Key="PeopleTemplate">
        <StackPanel Margin="3">
            <DockPanel >
                <Image Source="{Binding fldPrimaryPhoto}" />
            </DockPanel>
            <DockPanel>
                <TextBlock Text="{Binding fldUsername}" Foreground="Black" FontWeight="Bold" />
            </DockPanel>
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="PhotoTemplate">
        <StackPanel Margin="3">
            <DockPanel >
                <Image Source="{Binding fldPhoto}" />
            </DockPanel>
            <DockPanel>
                <TextBlock Text="{Binding fldUsername}" Foreground="Black" FontWeight="Bold" />
            </DockPanel>
        </StackPanel>
    </DataTemplate>

列表框:

<ListBox Name="lbPeople"
         ItemsSource="{Binding Path=Tables[0]}"
         IsSynchronizedWithCurrentItem="True"
         ItemTemplate="{StaticResource PeopleTemplate}"
         SelectionChanged="lbPeople_SelectionChanged" />
<ListBox Name="lbPhotos"
         Margin="0,0,326,0"
         ItemsSource="{Binding Path=Tables[1]}"
         IsSynchronizedWithCurrentItem="True"
         ItemTemplate="{StaticResource PhotoTemplate}" />

1 个答案:

答案 0 :(得分:3)

您应该构建一个更能代表您的数据的视图模型。

这是一个建议: 创建一个MainViewModel类,它将是您页面的DataContext。 MainViewModel将有一个ObservableCollection&lt; PersonViewModel&gt;为人民。 此外,它将具有一个属性SelectedPerson,您将绑定到人员列表的SelectedItem。 每个PersonViewModel都有一个ObservableCollection&lt; PhotoViewModel&gt;对于那个人的照片(也许是姓名或其他'人'数据)。

然后,你的xaml看起来会更像这样:

<ListBox Name="lbPeople"
         ItemsSource="{Binding People}"
         IsSynchronizedWithCurrentItem="True"
         ItemTemplate="{StaticResource PeopleTemplate}"
         SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"/>
<ListBox Name="lbPhotos"
         Margin="0,0,326,0"
         ItemsSource="{Binding SelectedPerson.Photos}"
         IsSynchronizedWithCurrentItem="True"
         ItemTemplate="{StaticResource PhotoTemplate}" />

因为SelectedItem是双向绑定到SelectedPerson属性,当您单击第一个列表中的某个人时,第二个列表将自动更新以显示该人的照片

您绑定的属性需要实现INotifyPropertyChanged。您可能想对MVVM design模式进行一些研究。一旦你习惯了它,它确实是WPF的唯一方法。我建议退房MVVM-light;它没有必要,但可以使一些视图模型设置更容易。