Проблемы производительности WPF FindAncestor

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

Я хочу использовать DataContext Base в дочернем элементе управления или ListBoxItem/ListViewItem.

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

FindAncestor

2 ответа

Дайте родителю имя и свяжите его с ElementName=,

Вместо обхода дерева визуалов 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}" />

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

Другие вопросы по тегам