You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF MVVM框架下ListBox项双击事件失效问题求助

ListBox列表项双击命令绑定失效的排查与修复

问题根源分析

你遇到的双击命令失效主要有两个核心问题:

  1. 命令绑定的目标上下文错误:当前用RelativeSource={RelativeSource AncestorType=Window}绑定命令,但你的ListBox并未将Window的DataContext设置为CityViewModel(而是通过StaticResource vmC直接绑定数据源),导致命令找不到对应的DelegateCommand实例。
  2. SelectedCity属性未触发通知:SelectedCity的setter没有调用属性变更通知方法,双击时可能无法获取最新选中项的值。

修复方案

方案1:修正命令绑定的源

将MouseBinding的命令绑定直接指向静态资源vmC,避免依赖Window的DataContext:

<ListBox HorizontalAlignment="Center" ItemsSource="{Binding Cities , Source={StaticResource vmC}}" SelectedItem="{Binding SelectedCity , Source={StaticResource vmC}}" Width="100" Height="200">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}">
                <TextBlock.InputBindings>
                    <MouseBinding Gesture="LeftDoubleClick"
                                  Command="{Binding Source={StaticResource vmC}, Path=ItemSelectedCommand}"/>
                </TextBlock.InputBindings>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

方案2:修复SelectedCity的属性通知

在CityViewModel中,给SelectedCity添加属性变更通知,确保选中项更新时能被ViewModel感知:

public class CityViewModel : ViewModelBase
{
    public DelegateCommand ItemSelectedCommand { get; private set; }

    private string _selectedCity;
    public string SelectedCity
    {
        get => _selectedCity;
        set => SetProperty(ref _selectedCity, value);
    }

    public List<string> Cities { get; private set; }

    public CityViewModel()
    {
        ItemSelectedCommand = new DelegateCommand(OnItemSelected);
        Cities = new List<string>() { "Bangalore", "New York", "Sydney", "London", "Washington" };
    }

    private void OnItemSelected()
    {
        var city = SelectedCity;
        // 此处添加双击后的业务逻辑
    }
}

可选优化:通过ItemContainerStyle绑定命令

如果希望双击ListBoxItem的任意区域都能触发命令(而非仅TextBlock区域),可以改用ListBox.ItemContainerStyle给ListBoxItem添加绑定:

<ListBox HorizontalAlignment="Center" ItemsSource="{Binding Cities , Source={StaticResource vmC}}" SelectedItem="{Binding SelectedCity , Source={StaticResource vmC}}" Width="100" Height="200">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="InputBindings">
                <Setter.Value>
                    <MouseBinding Gesture="LeftDoubleClick"
                                  Command="{Binding Source={StaticResource vmC}, Path=ItemSelectedCommand}"/>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

内容的提问来源于stack exchange,提问作者CodeJunkie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:27:20