【发布时间】:2020-08-04 18:13:04
【问题描述】:
我目前正在为 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();
}
【问题讨论】:
标签: c# wpf xaml contextmenu