选择另一个ListViewItem时更改DataContext

时间:2011-06-10 07:18:57

标签: c# .net wpf wpf-controls binding

我已经构建了一个由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;
       ...
    }
}

现在,我想知道,这是最好的方法吗?看起来有点被迫,但我无法设计得更好。

3 个答案:

答案 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>

快速解释此设置:

  • 窗口的datacontext设置为视图模型的实例
  • 将CollectionViewSource创建为资源,并使用视图模型公开的集合作为其源
  • listview的ItemsSource直接绑定到CollectionView(由CollectionViewSource公开)
  • Grid(包含您的表单元素)通过"/" binding path syntax绑定到CollectionView的CurrentItem;每次在列表视图中选择一个项目时,Grid的datacontext将自动设置为当前选定的项目

我更喜欢这种类型的绑定,因为必须引用特定的elemet和属性,并依赖于WPF的绑定和CollectionView类的内置功能。<​​/ p>