我正在尝试向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没有被调用。
答案 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开头。