【发布时间】:2017-12-20 14:32:00
【问题描述】:
我在 C# WPF 中摆弄,我遇到了一个我无法找到解决方案的问题。
问题,我有一个 .xml 文件,用户可以在其中创建键绑定,其值是他们在按下键绑定组合时想要播放的声音。该文件在开始时被读取,键绑定被添加到列表中,并且还被创建为 KeyBinding,然后被添加到视图中。
Keybindings.Add(new KeybindingsViewModel(key, modifier, sound)); //Adds it as object to my custom class.
var kb = new KeyBinding(TestCommand, new KeyGestureConverter().ConvertFromString(modifier + "+" + key) as KeyGesture); //creates a KeyBinding.
这一切正常,当我按下预定义的键绑定时,我的命令被执行,但是我似乎无法向命令添加参数。
我想要做的是,每当按键被按下时,应该播放的声音的名称将 get 作为参数发送到命令。此名称与我的自定义类中的组合键一起存储。因此,如果我可以在开始时将该名称添加到 var kb (KeyBinding) 中,那就太好了。 我知道如果我在 view.Xaml 中声明一个键绑定,我可以添加一个参数。所以我认为也必须可以从视图模型中这样做。
示例 2
我的另一个尝试是使用视图中使用的现有 ItemsSource 来动态添加声音并在那里添加键绑定。 比如:
<ItemsControl x:Name="MySounds" ItemsSource="{Binding RelativeSource=sound}" >
<!--Defines the template to use a wrappanel-->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!--Inputbindings for the sounds-->
<ItemsControl.InputBindings>
<KeyBinding Key="{Binding Path=Keybind}" Modifiers="{Binding Path=Modifiers}"
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.PlaySound}"
CommandParameter="{Binding Path=Name}" />
</ItemsControl.InputBindings>
因此,在具有与其关联的 Sounds 集合的 ItemsControl 中,其中也有关联的键绑定,只需将这些值用于键绑定。但是,我似乎无法正确获取绑定源,唯一真正进入正确源的是命令,当我在键和修饰符中放置一些占位符时,它确实有效。但它不带参数,我只是讨厌这些绑定并且永远无法弄清楚它们的关系。
如果这是一种完全糟糕的方式,那么请告诉我,这正是我认为以我目前的知识应该可能的方式。
另外,我不太确定这是否会违反 MVVM 原则。
【问题讨论】:
-
我不确定我是否理解您的问题。您是在 XAML 中还是以编程方式定义 KeyBindings?是否要将 CommandParameter 绑定到单个项目的 Name 属性?或者你的问题是什么?您不能只设置您以编程方式创建的 KeyBinding 的 CommandProperty 吗?
-
我想我搞砸了,我非常执着于在创建新的 KeyBinding 时无法添加参数,以至于我什至没有考虑在创建后添加它。跨度>
-
@mm8 我想以编程方式创建我的 KeyBindings,因为我必须从列表中获取数据,以便用户可以修改它们。CommandParameter 将是与特定组合键关联的名称。但是我想我已经解决了这个问题。为什么总是在寻求帮助后你想通了...