【问题标题】:Add Parameter when creating a KeyBinding in ViewModel在 ViewModel 中创建 KeyBinding 时添加参数
【发布时间】: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 将是与特定组合键关联的名称。但是我想我已经解决了这个问题。为什么总是在寻求帮助后你想通了...

标签: c# wpf mvvm


【解决方案1】:

KeyBinding 类有一个CommandParmeter 属性,您可以在创建对象后设置该属性:

var kb = new KeyBinding(TestCommand, new KeyGestureConverter().ConvertFromString(modifier + "+" + key) as KeyGesture);
kb.CommandParameter = "...";

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2011-05-02
    • 2023-01-04
    相关资源
    最近更新 更多