WPF FindAncestor性能问题

时间:2016-01-20 07:38:40

标签: c# wpf findancestor

在Binding中使用 FindAncestor 会遇到性能问题。

我想在Child User Control或ListBoxItem / ListViewItem中使用Base的DataContext。

这个问题的替代方案是什么?

FindAncestor

2 个答案:

答案 0 :(得分:0)

为父级提供名称,并使用ElementName=绑定到该名称。

答案 1 :(得分:0)

不是使用FindAncestor遍历可视树,而是可以遍历当前控件的DataContext。为了能够做到这一点,您需要在ViewModels中向父ViewModel提供引用。我通常有一个基础ViewModel类,其中包含属性ParentRoot

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