[英]Multibinding Converter not called in ItemsControl
當SelectedItem
值更改時,它不會觸發SelectedItemConverter
。
我嘗試使用SetCurrentValue
和InvalidateProperty
並擺弄NotifyOnSourceUpdated
、 UpdateSourceTrigger
和Mode
等屬性。
可悲的是,它們不起作用。
也許我應該在父母 xaml 中添加一些東西來推動它? 目前它的:
<local:Menu
SelectedItem="{Binding SelectedMenuItem}"
OnSelect="{Binding OnSelectCommand}" Items="{Binding MenuItems}"/>
感謝幫助。
控制 xaml
<UserControl>
<UserControl.Resources>
<vm:MockMenuViewModel x:Key="DesignViewModel"/>
<cv:SelectedItemConverter x:Key="SelectedItemConverter"/>
</UserControl.Resources>
<ItemsControl
d:DataContext="{Binding Source={StaticResource DesignViewModel}}"
ItemsSource="{Binding Path=MenuItems, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type MenuItem}">
<Button Content="{Binding Name}"
Command="{Binding OnSelect, RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}">
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource SelectedItemConverter}"
NotifyOnSourceUpdated="True"
NotifyOnTargetUpdated="True" Mode="OneWay">
<Binding Path="SelectedItem" UpdateSourceTrigger="PropertyChanged" Mode="OneWay"/>
<Binding Path="." Mode="OneWay"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</UserControl>
控制中心
public partial class Menu : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public Menu()
{
InitializeComponent();
}
public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
"SelectedItem",
typeof(MenuItem),
typeof(Menu),
new PropertyMetadata(null, OnSelectedItemChanged));
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
"Items",
typeof(IEnumerable<MenuItem>),
typeof(Menu),
new FrameworkPropertyMetadata(null));
public static readonly DependencyProperty OnSelectProperty = DependencyProperty.Register(
"OnSelect",
typeof(ICommand),
typeof(Menu),
new PropertyMetadata(null, OnSelectChanged));
public MenuItem SelectedItem
{
get => (MenuItem)GetValue(SelectedItemProperty);
set
{
SetValue(SelectedItemProperty, value);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Items)));
}
}
public IEnumerable<MenuItem> Items
{
get => (IEnumerable<MenuItem>)GetValue(ItemsProperty);
set => SetValue(ItemsProperty, value);
}
public ICommand OnSelect
{
get => (ICommand)GetValue(OnSelectProperty);
set => SetValue(OnSelectProperty, value);
}
public static void OnSelectedItemChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
var menu = dependencyObject as Menu;
if (menu == null)
{
return;
}
menu.InvalidateProperty(SelectedItemProperty);
menu.InvalidateProperty(ItemsProperty);
}
public static void OnSelectChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
var menu = dependencyObject as Menu;
if (menu == null)
{
return;
}
menu.SetCurrentValue(OnSelectProperty, eventArgs.NewValue);
}
}
如果您嘗試綁定到父Menu
UserControl
的SelectedItem
屬性,您應該指定一個RelativeSource
:
<Binding Path="SelectedItem"
RelativeSource="{RelativeSource AncestorType=UserControl}"
UpdateSourceTrigger="PropertyChanged" Mode="OneWay"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.