WPF ComboBox的SelectionChanged事件无法触发命令

8
我有下面这个XAML,其中包含一个后台代码中的SelectionChanged事件处理程序和ViewModel的另一个Command属性。我已将SelectedIndex属性设置为0。现在运行项目时,会调用后台代码处理程序,但不执行命令。我的目标是,在视图加载时,对于SelectedIndex=0,应该第一次执行Command。
<ComboBox Name="listComboBox" SelectionChanged="listComboBox_SelectionChanged" SelectedIndex="0" SelectedValuePath="Content" Margin="5,0" Height="35" Width="150" VerticalAlignment="Center" HorizontalAlignment="Left">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding ListTypeComboSelectionChangedCmd}" CommandParameter="{Binding ElementName=listComboBox, Path=SelectedValue}"/>
        </i:EventTrigger>
     </i:Interaction.Triggers>
     <ComboBoxItem Content="ItemOne" />
     <ComboBoxItem Content="ItemTwo" />
     <ComboBoxItem Content="ItemThree" />
</ComboBox>

更新

代码后端事件处理程序:

private void listComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { }

ICommand object:

public ICommand ListTypeComboSelectionChangedCmd 
{ 
    get { return new RelayCommand<string>(ListTypeComboSelectionChangedCmdExec); }
    private set;
}

ICommand Handler:

private void ListTypeComboSelectionChangedCmdExec(string listType) { }

这是为什么?如果你想在视图加载后立即发生某些事情,为什么不在它加载时就做呢?此外,在创建时(而不是运行时)在xaml中设置SelectedIndex不会触发任何事件。 - Xavier Huppé
你有一个事件和一个命令用于同一件事情。摆脱内联事件调用。 - Xcalibur37
@Lucifer,如果是这样,请发布触发你所说的事件的代码(在视图加载后)。 - Xavier Huppé
@Sinity,根据您的要求,我已经更新了我的问题,但是我不确定这会有多大帮助。 - Lucifer
你在ListTypeComboSelectionChangedCmdExec中试图做什么? - Michal Ciechan
显示剩余2条评论
2个回答

9

SelectedValue绑定到视图模型上的一个Property

Propertyset{...}块中执行逻辑或调用。

ListTypeComboSelectionChangedCmdExec(value)

请参考MVVM模式下绑定ComboBox的SelectedItem问题。


5
这是个聪明的解决方案,但我更希望保持setter的简洁。此外,我更想知道为什么这样的功能不能正常工作,即SelectionChanged事件会触发但不执行基础命令。无论如何,谢谢。 - Lucifer
为什么不将 SelectedValue 绑定到属性,而是在视图的 OnLoaded 事件处理程序中将其设置为第一个值。Setter 逻辑是次优的。 - Richard June
@Lucifer 回复有点晚了,但我猜测事件在行为“附加”之前被触发。 - Michal Ciechan

4
在我的情况下,我在代码后端中使用处理程序,并将其连接到以下的ModelView。
var viewModel = (MyViewModel)DataContext;
if (viewModel.MyCommand.CanExecute(null))
    viewModel.MyCommand.Execute(null);

请查看此链接:从代码后台调用命令

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接