如何在wpf的上下文菜单中创建绑定项目的选择?

问题描述 投票:0回答:1

我目前正在为WPF中的仿真器开发前端,但在使用此看似基本的功能时遇到了麻烦。

我正在尝试从上下文菜单(在这种情况下为图像)中创建对项目的简单选择。图片更好地解释了它:

“

我一次只希望选择/检查一个,然后此数据在我的模型中设置一个值,该值最终被写入外部文件。在一个原型中,我将其绑定到具有双向绑定的组合框,但这在这种设计中并没有任何意义。

我尝试了几种不同的方法,但是没有设法找到合适的解决方案(特别是如何控制未单击项的isChecked。)>

我的上下文菜单(xaml)看起来像这样:

<ContextMenu>
    <MenuItem Header="PCSX2 Version" ItemsSource="{Binding Versions}">
        <MenuItem.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="StaysOpenOnClick" Value="True" />
                <Setter Property="BindingGroup" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}}" />
                <EventSetter Event="Click" Handler="SetVersion" />
            </Style>
        </MenuItem.ItemContainerStyle>
    </MenuItem>
    <MenuItem Header="Config" ItemsSource="{Binding Configs}" />
    <MenuItem Header="Create Config" BindingGroup="{Binding}" Click="ShowConfigWizard"/>
</ContextMenu>

下面显示了我的模型,但后面的代码(SetVersion函数)尚不起作用。如您在下面看到的,我尝试了一种涉及绑定元组的解决方案,但是无法使其工作(尽管绑定条件不再成立,ischecked值从未更新)。

我还尝试了基于单选按钮的解决方案(同样无法使它正常工作),并且只是将后面代码中的所有项目都设置为false(无法从绑定中选择同级菜单项)。

public class GameModel : ICloneable
{
    public string Game { get; set; }
    public string Path { get; set; }
    public IEnumerable<string> Versions { get; set; }
    public IEnumerable<Tuple<string, bool>> VersionsAndStates => Versions.Select(version => new Tuple<string, bool>(version, Version == version));
    public string Version { get; set; }
    public IEnumerable<string> Configs { get; set; }
    public string Config { get; set; }
    public string CoverPath { get; set; }

    object ICloneable.Clone() => Clone();
    public GameModel Clone() => (GameModel) MemberwiseClone();
}

我目前正在为WPF中的仿真器开发前端,但在使用此看似基本的功能时遇到了麻烦。我正在尝试从上下文菜单(在...

c# wpf xaml contextmenu
1个回答
0
投票

通常,我只是发布询问一个解决方案,然后我发现它是如此接近,对ViewModel的工作原理只作了一点疏忽。万一其他人有类似的问题,我将在下面介绍我的解决方案。主要变化是在我的模型中。

© www.soinside.com 2019 - 2024. All rights reserved.