如何将Colmmand添加到ComboBox

时间:2017-11-03 13:36:59

标签: wpf combobox command

我正在尝试向ComboBox添加命令功能。经过一番搜索,我决定采用以下方法作为简化:

1)将System.Windows.Interactivity.dll添加到我的参考文献

2)将以下内容添加到我的XAML

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

3)将以下内容添加到我的ComboBox

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
      <i:InvokeCommandAction Command="{Binding ChangePlanner}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

我有两个问题:

A)这是最简单的方法吗?如果没有,那是什么?

B)如果这是正确的方法,为什么它不起作用?也就是说,我的ChangePlanner Sub没有被调用。

2 个答案:

答案 0 :(得分:1)

以下是使用带有ComboBox的触发器的快速工作示例:

<强>视图模型

public class ShellViewModel : BindableBase
{
    private string _selectedItem;

    public string Title => "Sample";

    public ObservableCollection<string> Items
    {
        get;
    } = new ObservableCollection<string>(new[] { "A", "B", "C" });

    public string SelectedItem
    {
        get => _selectedItem;
        set => SetProperty(ref _selectedItem, value);
    }

    public ICommand ChangeCommand => new DelegateCommand<string>(s => Debug.WriteLine($"Command Executed: {s}"));
}

查看

<Window x:Class="Poc.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:viewModels="clr-namespace:Poc.ViewModels"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    mc:Ignorable="d"
    Title="{Binding Title}" Height="350" Width="525">
<Window.DataContext>
    <viewModels:ShellViewModel />
</Window.DataContext>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <ComboBox Grid.Row="0" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
        <i:Interaction.Triggers>
               <i:EventTrigger EventName="SelectionChanged">
                   <i:InvokeCommandAction Command="{Binding ChangeCommand}" CommandParameter="{Binding SelectedItem}"></i:InvokeCommandAction>
               </i:EventTrigger>
        </i:Interaction.Triggers>
    </ComboBox>
</Grid>

尚未看到您的代码已发布,但我猜您正在尝试绑定到某个方法(而不是ICommand)。

答案 1 :(得分:0)

  

这是最简单的方法吗?如果没有,那是什么?

最直接和MVVM友好的方法是将SelectedItem的{​​{1}}绑定到视图模型的source属性并处理任何逻辑,或者在此setter中调用命令之一:

ComboBox
  

为什么它不起作用?

无法根据您提供的信息说出来。确保private object _selectedItem; public object SelectedItem { get { return _selectedItem; } set { _selectedItem = value; ChangePlanner.Execute(null); } } ChangePlanner的{​​{1}}的公共属性,它返回一个ICommand开头。