2016-01-20 7 views
0

Использование FindAncestor in Binding имеет проблемы с производительностью.Проблемы с производительностью WPF FindAncestor

Я хочу использовать DataContext базы данных в Child User Control или ListBoxItem/ListViewItem.

Что такое альтернатива этой проблеме?

FindAncestor

+0

Я думаю, что FindAncestor - это путь, потому что ListBoxItems имеют свой собственный DataContext. Как это дает проблемы с производительностью? –

ответ

0

Дайте родителю имя и привязать к нему с ElementName=.

0

Вместо того, чтобы перемещаться по визуальному дереву с помощью FindAncestor, вы можете пересечь DataContext вашего текущего элемента управления. Чтобы это сделать, вам нужна ссылка в вашем ViewModels родительскому ViewModel. У меня обычно есть базовый ViewModel класс, который имеет свойство Parent и Root:

public abstract class ViewModel : INotifyPropertyChanged 
{ 
    private ViewModel parentViewModel; 

    public ViewModel(ViewModel parent) 
    { 
     parentViewModel = parent; 
    } 

    /// <summary> 
    /// Get the top ViewModel for binding (eg Root.IsEnabled) 
    /// </summary> 
    public ViewModel Root 
    { 
     get 
     { 
      if (parentViewModel != null) 
      { 
       return parentViewModel.Root; 
      } 
      else 
      { 
       return this; 
      } 
     } 
    } 
} 

В XAML, вы можете заменить это:

<ComboBox x:Name="Sector" 
       ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.SectorList}" 
       SelectedValuePath="Id" 
       SelectedValue="{Binding SectorId, Mode=TwoWay}" /> 

К этому:

<ComboBox x:Name="Sector" 
       ItemsSource="{Binding Root.SectorList}" 
       SelectedValuePath="Id" 
       SelectedValue="{Binding SectorId, Mode=TwoWay}" /> 

One требование: свойства Root всегда должны существовать в самом верхнем ViewModel.

 Смежные вопросы

  • Нет связанных вопросов^_^