我已经构建了一个由ListView和一个带有几个文本框的面板组成的界面。为了在选择另一个ListViewItem时更改这些文本框中的上下文,我捕获了SelectionChange事件,以相应地更改文本框的DataContexts。像这样:
void customersList_SelectItem(object sender, SelectionChangedEventArgs e)
{
Customer customer = (Customer)customersList.Selected;
if (customer != null)
{
addressField.DataContext = customer;
phoneField.DataContext = customer;
mobileField.DataContext = customer;
webField.DataContext = customer;
emailField.DataContext = customer;
faxField.DataContext = customer;
...
}
}
现在,我想知道,这是最好的方法吗?看起来有点被迫,但我无法设计得更好。
答案 0 :(得分:3)
如果文本框全部包含在包含元素(例如网格)中,那么您只需设置Grid元素的DataContext即可。这会更清洁。
更好的是使用XAML绑定和MVVM,并且可以在XAML中以声明方式实现此代码。
答案 1 :(得分:2)
将依赖控件DataContext属性绑定到ListBox的SelectedItem属性。
或者更好的是,如果它们位于容器控件中 - 设置一次数据上下文并让子项继承它。有点像...
<StackPanel DataContext="{Binding ElementName=ListBoxName, Path=SelectedItem}">
<!--- dependent controls -->
</StackPanel>
答案 2 :(得分:0)
您还可以将WPF中的"/" binding path syntax与CollectionView结合使用:
<Window ... xmlns:local="...">
<Window.DataContext>
<local:MyViewModel ... />
</Window.DataContext>
<Window.Resources>
<CollectionViewSource x:Key="ItemsView" Source="{Binding Path=Items}" />
<Window.Resources>
<ListView ItemsSource="{Binding Source={StaticResource ItemsView}}">
...
</ListView>
<Grid DataContext="{Binding Source={StaticResource ItemsView}, Path=/}">
...
</Grid>
</Window>
快速解释此设置:
我更喜欢这种类型的绑定,因为必须引用特定的elemet和属性,并依赖于WPF的绑定和CollectionView类的内置功能。</ p>