簡體   English   中英

ItemsControl 中未調用多重綁定轉換器

[英]Multibinding Converter not called in ItemsControl

SelectedItem值更改時,它不會觸發SelectedItemConverter

我嘗試使用SetCurrentValueInvalidateProperty並擺弄NotifyOnSourceUpdatedUpdateSourceTriggerMode等屬性。

可悲的是,它們不起作用。

也許我應該在父母 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 UserControlSelectedItem屬性,您應該指定一個RelativeSource

<Binding Path="SelectedItem"
    RelativeSource="{RelativeSource AncestorType=UserControl}"
    UpdateSourceTrigger="PropertyChanged" Mode="OneWay"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM