如何为ComboBox定义命令?

时间:2018-01-22 20:30:56

标签: c# wpf

我想知道是否可能将Command绑定到ComboBox,我实际上在Command上实现了Menu逻辑,这样:

 <Menu HorizontalAlignment="Left" VerticalAlignment="Stretch">
      <MenuItem Header="Theme" Width="100" 
                ItemContainerStyle="{StaticResource ThemeColorMenuItemStyle}"
                ItemsSource="{Binding Themes, Mode=OneTime}" />
</Menu>

ItemContainerStyle具有此结构:

<Style x:Key="AccentColorMenuItemStyle"
           BasedOn="{StaticResource MetroMenuItem}" TargetType="{x:Type MenuItem}">
        <Setter Property="CommandParameter" Value="{Binding }" />
        <Setter Property="Command" Value="{Binding DataContext.ApplyAccentCommand, 
            RelativeSource={RelativeSource AncestorType=Window}}" />
        <Setter Property="Header" Value="{Binding Name, Mode=OneWay}" />
        <Setter Property="Icon" Value="{StaticResource AccentMenuIcon}" />
    </Style>

这是命令:

 public ICommand ApplyAccentCommand { get; } = new SimpleCommand(o => ApplyAccent((Swatch)o));

    private static void ApplyAccent(Swatch swatch)
    {
        new PaletteHelper().ReplaceAccentColor(swatch);
    }

MenuItemTheme提供的MaterialDesignInXaml集合绑定为具有此类的Swatch模型:

public class Swatch
{
    public Swatch(string name, IEnumerable<Hue> primaryHues, IEnumerable<Hue> accentHues);

    public string Name { get; }
    public Hue ExemplarHue { get; }
    public Hue AccentExemplarHue { get; }
    public IEnumerable<Hue> PrimaryHues { get; }
    public IEnumerable<Hue> AccentHues { get; }
    public bool IsAccented { get; }

    public override string ToString();
}

所以,回到问题:可能在ComboBox上有这个逻辑吗? &#39;因为MenuItem没有SelectedItem属性,我需要这个。

1 个答案:

答案 0 :(得分:0)

您可以使用混合行为并将事件绑定到命令。您需要引用System.Windows.Interactivity命名空间,您可以通过安装Expression.Blend.Sdk NuGet包来获取它。

安装完成后,将以下XAML命名空间添加到您的页面:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

然后按如下方式使用它:

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

MvvmLight工具包还提供名为InvokeCommandAction的{​​{1}}更高级版本,允许您指定EventToCommand以便能够从中获取特定值事件的EventArgsConverter实例。