繁体   English   中英

如何在整个控件上使用 MouseBinding?

[英]How do I use the MouseBinding on the entire control?

我有一个ListView ,目标是能够双击一个项目以显示一些数据。 我现在拥有的东西可以工作,但前提是我在绿色区域内单击。 如果我在绿色区域外(在它的右边)双击,它不会调用我的命令。 为什么会这样,解决这个问题的正确方法是什么?

XAML

<ListView ItemsSource="{Binding NetworkObjects}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.InputBindings>
                    <MouseBinding Gesture="LeftDoubleClick" 
                                  Command="{Binding DisplayItemCommand}"/>
                </Grid.InputBindings>
                <StackPanel Background="Green">
                    <TextBlock Text="{Binding Address}"/>
                    <TextBlock Text="{Binding Port}"/>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

主视图模型

public ObservableCollection<NetworkObject> NetworkObjects { get; set; }
public MainViewModel()
{
    NetworkObjects = new ObservableCollection<NetworkObject>();
    for (int i = 0; i < 10; i++)
    {
        NetworkObjects.Add(new NetworkObject() { Address = $"Address {i}", Port = i });
    }
}

网络对象

public class NetworkObject
{
    public string Address { get; set; }
    public int Port { get; set; }

    /* CRUD Commands */
    public RelayCommand DisplayItemCommand { get; set; }

    public NetworkObject()
    {
        DisplayItemCommand = new RelayCommand(o => 
        {
            MessageBox.Show("Wohoo!");
        });
    }

}

中继指令

public class RelayCommand : ICommand
{
    private Action<object> execute;
    private Func<object, bool> canExecute;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        this.execute = execute;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return this.canExecute == null || this.canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        this.execute(parameter);
    }
}

修复。 我决定创建自定义ListViewItem样式并在其中绑定数据。 不,这消除了 hover 效果,但可以使用触发器轻松实现。

<ListView ItemsSource="{Binding NetworkObjects}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid Margin="2">
                            <Grid.InputBindings>
                                <MouseBinding Gesture="LeftDoubleClick" 
                                  Command="{Binding DisplayItemCommand}"/>
                            </Grid.InputBindings>
                            <StackPanel Background="Green">
                                <TextBlock Text="{Binding Address}"/>
                                <TextBlock Text="{Binding Port}"/>
                            </StackPanel>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.ItemContainerStyle>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM