Я не могу синхронизировать Master / Detail ListBoxes в WPF - PullRequest
1 голос
/ 15 февраля 2012

У меня проблемы с синхронизацией двух списков в WPF.

Я создал и заполнил набор данных двумя таблицами данных. Один DataTable для людей, а другой DataTable для их фотографий.

Я могу заставить оба ListBox'а функционировать независимо друг от друга, но я хочу, чтобы они работали как Master to Detail.

Это мой первый проект WPF, поэтому любые предложения очень ценятся!

C # КОД:

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>

ListBoxes:

<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 Ответ

3 голосов
/ 15 февраля 2012

Вы должны построить модель представления, которая будет более представительной для ваших данных.

Вот предложение: создайте класс MainViewModel, который будет DataContext для вашей страницы.MainViewModel будет иметь ObservableCollection для людей.Также у него будет свойство SelectedPerson, которое вы будете привязывать к SelectedItem списка людей.Каждый PersonViewModel будет иметь ObservableCollection для фотографий этого человека (и, возможно, имени или других данных «персоны»).

Тогда ваш 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 ;это не обязательно, но может немного упростить настройку viewmodel.

...