Изменение DataContext при выборе другого ListViewItem - PullRequest
0 голосов
/ 10 июня 2011

Я построил интерфейс, образованный 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 ]

3 голосов
/ 10 июня 2011

Если бы все текстовые поля содержались в содержащем элементе (например, Grid), тогда вы могли бы просто установить DataContext элемента Grid. Это будет чище.

Еще лучше было бы использовать привязку XAML и MVVM , и этот код можно было бы декларативно реализовать в XAML.

2 голосов
/ 10 июня 2011

Свяжите свойство DataContext зависимых элементов управления со свойством ListBox SelectedItem.

Или, что еще лучше, если они находятся в элементе управления контейнера - задайте его контекст данных один раз, и потомки его наследуютЧто-то вроде ...

<StackPanel DataContext="{Binding ElementName=ListBoxName, Path=SelectedItem}">
   <!--- dependent controls -->
</StackPanel>
0 голосов
/ 23 июня 2011

Вы также можете использовать синтаксис пути привязки "/" в WPF в сочетании с 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>

Чтобы быстро объяснить эту настройку:

  • Текст данных окна настроен на экземпляр модели представления
  • CollectionViewSource создается как ресурс и использует коллекцию, предоставляемую моделью представления, в качестве источника
  • Элемент ItemsSource представления списка напрямую связан с CollectionView (предоставляется CollectionViewSource)
  • Сетка (которая будет содержать элементы формы) связана с CurrentItem объекта CollectionView с помощью синтаксиса пути привязки "/" ; каждый раз, когда элемент выбирается в виде списка, текст данных сетки автоматически устанавливается на текущий выбранный элемент

Я предпочитаю этот тип связывания, а не ссылаться на определенные элементы и свойства и полагаться на встроенную мощь связывания WPF и классов CollectionView.

...