Проблемы производительности WPF FindAncestor
2 ответа
Вместо обхода дерева визуалов 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
,