我在C#WPF中摆弄,我遇到了一个无法找到解决方案的问题。
问题是,我有一个.xml文件,用户可以在按键绑定组合时创建一个键值,使用他们想要播放的声音值。此文件在开始时被读取,并且键绑定被添加到List中,并且还被创建为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.
这一切都运行正常,当我按下预定义的键绑定时,我的命令被执行,但是我似乎无法在命令中添加参数。
我希望能够做到的是,无论何时按下按键,应播放的声音的名称都会作为参数发送给命令。此名称与我的自定义类中的keycombination一起存储。因此,如果我可以在开始时将该名称添加到var kb(KeyBinding),这将是很好的。 我知道如果我在view.Xaml中声明一个Keybinding,我可以添加一个参数。所以我认为必须可以从viewmodel这样做。
我的另一个尝试是使用视图中使用的现有ItemsSource来动态添加Sounds并在那里添加keybinds。 类似的东西:
<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中,它们也有相关的键绑定,只需将这些值用于Keybinding。但是我似乎无法正确获取绑定源,唯一真正适用于正确源的是命令,当我在Key和Modifiers中放置一些占位符时确实有效。但它并没有采用它的参数,我只是讨厌这些绑定而且无法弄清楚它们之间的关系。
如果这是一个非常糟糕的方式来做这件事,请告诉我,这正是我认为应该可以利用我目前的知识。
另外,我不太确定这是否会打破MVVM原则。
答案 0 :(得分:1)
KeyBinding
类具有CommandParmeter
属性,您可以在创建对象后设置该属性:
var kb = new KeyBinding(TestCommand, new KeyGestureConverter().ConvertFromString(modifier + "+" + key) as KeyGesture);
kb.CommandParameter = "...";