WPF按钮按下/释放绑定

wkyowqbh  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(283)

我是WPF的新手,正在尽最大努力按照MVVM按钮操作。我正在处理当前的问题,我有一个视图模型类

public class MainViewModel
{
    private bool _Reset;
    public bool Reset{ get{ return _Reset;} set {_Reset = value;} }
    ...
}

现在我想绑定一个按钮,这样如果我按下它时_Reset为true,而当我释放它时_Reset为false,我会觉得命令模式对于一个简单的开/关来说工作量很大
是否有办法将按钮的IsPressed绑定到数据上下文中的属性
我想尽可能简单地执行此操作,因为我有一打左右的按钮,它们都在执行其他属性类型的操作

dced5bon

dced5bon1#

所以你需要做的就是导入System.Windows.Interactivity。转到references,添加reference,Assemblies,Extensions。你会在那里找到它。接下来把它添加到你的项目中
xmlns:inter="http://schemas.microsoft.com/expression/2010/interactivity"
现在可以使用PreviewMouseLeftButtonDownPreviewMouseLeftButtonUp事件。

<Button Content="Some Button">
        <inter:Interaction.Triggers>
            <inter:EventTrigger EventName="PreviewMouseLeftButtonDown">
                <inter:InvokeCommandAction Command="{Binding ButtonDown}"/>
            </inter:EventTrigger>
            <inter:EventTrigger EventName="PreviewMouseLeftButtonUp">
                <inter:InvokeCommandAction Command="{Binding ButtonUp}"/>
            </inter:EventTrigger>
        </inter:Interaction.Triggers>
    </Button>

 public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        ButtonDown = new RelayCommand(OnButtonDown);
        ButtonUp = new RelayCommand(OnButtonUp);
    }
    public RelayCommand ButtonDown { get; set; }
    public RelayCommand ButtonUp { get; set; }

    private void OnButtonUp()
    {
        Debug.WriteLine("Button Released");
    }

    private void OnButtonDown()
    {
        Debug.WriteLine("Button Pressed");
    }
}
kadbb459

kadbb4592#

如果使用.NET Core 3.1 / .NET 5.0或更高版本,则System.Windows.Interactivity已被弃用,请改为将Microsoft.Xaml.Behaviors.Wpf NuGet包添加到项目中。该包的工作方式与.NET Framework 4.8.x或更低版本的answer here非常相似。
在你的xaml头中你需要添加引用到

<Control x:Class="YourNamespace.ControlName"
         ...
         xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
         ...>

现在,您可以装饰按钮或其他项目,您尝试的事件触发器,如PreviewMouseLeftButtonDown

<Button Content="Click Me.">
    <b:Interaction.Triggers>
        <b:EventTrigger EventName="PreviewMouseLeftButtonDown">
             <b:InvokeCommandAction Command="{Binding OnButtonDown}"/>            
        </b:EventTrigger>
        <b:EventTrigger EventName="PreviewMouseLeftButtonUp">
             <b:InvokeCommandAction Command="{Binding OnButtonUp}"/>            
        </b:EventTrigger>
    </b:Interaction.Triggers>
</Button>

现在允许绑定到视图模型类中的System.Windows.Input.ICommand属性,在这个例子中,我使用CommunityToolkitm.Mvvm中的RelayCommand对象并写入调试控制台,但是这可以用任何对静态项的调用来内联替换,或者如果操作不是静态项,可以在视图模型类的构造函数中完成。

class ControlViewModel : ObservableObject
{
    //... 
    public ICommand OnButtonDown { get; } = new RelayCommand(()=> Debug.WriteLine("Button Down");
    public ICommand OnButtonUp { get; } = new RelayCommand(()=> Debug.WriteLine("Button Up");
    //...
}

相关问题