在Binding中使用 FindAncestor 会遇到性能问题。
我想在Child User Control或ListBoxItem / ListViewItem中使用Base的DataContext。
这个问题的替代方案是什么?
答案 0 :(得分:0)
为父级提供名称,并使用ElementName=
绑定到该名称。
答案 1 :(得分: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}" />
一个要求:Root
属性始终必须存在于最顶层ViewModel
。