我在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}" />
答案 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;它没有必要,但可以使一些视图模型设置更容易。