Кнопка ContextMenu Изображение отображается только на последнем элементе - PullRequest
0 голосов
/ 18 марта 2020

У меня проблема с динамическим c ContextMenu на Button.

. Button находится внутри DataGrid со следующим определением Column в ResourceDictionary:

<DataGridTemplateColumn Width="16" x:Key="ShowContextMenuColumn" x:Shared="False" KeyboardNavigation.IsTabStop="False">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Style="{StaticResource ShowContextMenuButtonStyle}">
                <Button.ContextMenu>
                    <ContextMenu ItemsSource="{Binding Data.ContextActionItems, Source={StaticResource proxy}}" DisplayMemberPath="DisplayText">
                        <ContextMenu.Resources>
                            <Style TargetType="{x:Type MenuItem}">
                                <Setter Property="Icon">
                                    <Setter.Value>
                                        <Image Source="{Binding Image}"/>
                                    </Setter.Value>
                                </Setter>
                                <Setter Property="Command" Value="{Binding Command}"/>
                            </Style>
                        </ContextMenu.Resources>
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellStyle>
        <Style TargetType="{markup:Type DataGridCell}" BasedOn="{StaticResource BaseDataGridCellStyle}">
            <Setter Property="AutomationProperties.Name" Value="ContextMenu"/>
        </Style>
    </DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>

ObservableCollection<DisplayListActionItem> для ContextActionItems определяется в абстрактном базовом классе c, который наследуется несколькими моделями представления.

DisplayListActionItem-Class выглядит следующим образом:

public class DisplayListActionItem : NotifyBase
{
    public string DisplayText
    {
        get { return Get<string>(); }
        set { Set(value); }
    }

    public ICommand Command
    {
        get { return Get<ICommand>(); }
        set { Set(value); }
    }

    public ImageSource Image
    {
        get { return Get<ImageSource>(); }
        set { Set(value); }
    }
}

Все просто отлично работает. Единственная проблема заключается в том, что изображение отображается только на последнем элементе ContextMenu. Если я удаляю последний элемент, то отображается изображение нового последнего элемента. Я не понимаю, в чем причина этого.

Я уже проверил выходные данные отладки на наличие ошибок привязки, но их нет.

Есть идеи, что может вызвать эту проблему?

1 Ответ

0 голосов
/ 19 марта 2020

Решил сам.

Решением было модифицировать ContextMenu-ItemContainerStyle вместо того, чтобы делать необходимые вещи в ресурсах ContextMenu.

Новый xaml для Button выглядит следующим образом:

<Button Style="{StaticResource ShowContextMenuButtonStyle}">
    <Button.ContextMenu>
        <ContextMenu ItemsSource="{Binding Data.ContextActionItems, Source={StaticResource proxy}}" >
            <ContextMenu.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Icon" Value="{Binding Image, Converter={converter:ImageSourceToImageConverter}}"/>
                    <Setter Property="Header" Value="{Binding DisplayText}"/>
                    <Setter Property="Command" Value="{Binding Command}"/>
                </Style>
            </ContextMenu.ItemContainerStyle>
        </ContextMenu>
    </Button.ContextMenu>
</Button>
...