从XAML绑定到特定类

本文关键字:XAML 绑定 | 更新日期: 2023-09-27 18:28:59

我必须使用ICommand执行绑定,但我声明ICommand的特定类似乎甚至没有被触发。我在我的AccView.xaml UserControl 中定义了以下按钮

<Button x:Name="buttonInit" Content="init" Height="32" Cursor="Hand" Command="{Binding initCommand}" HorizontalAlignment="Left" Margin="24,43,0,0" VerticalAlignment="Top" Width="156" Style="{DynamicResource RoundCornerButton}" />

然后我使用特定的类SetAccValues.cs:

public class GetAccValues : AccView
{
    public ICommand initCommand 
    {
        get { return new DelegateCommand<object>(initBluetooth, canInit); }
    }
    private async void initBluetooth(object context)
    {
        int serviceNumb = 1;
        await InitializeAsync(PerformAccOperations.Readings.None, serviceNumb);
        if (SensorOK && Initialized != null) Initialized(this);
    }
    private bool canInit(object context)
    {
        return true;
    }
}

但问题是,当我按下按钮时,ICommand甚至没有被触发。这种情况下的问题在哪里?。

从XAML绑定到特定类

看起来缺少一个DataContext。在您提到的评论中,GetAccValues是您的ViewModel。你可以在codebehind中设置它。就像NSFW的回答一样。只将其设置为ViewModel的实例,而不是视图本身。

或者,您可以在XAML中执行:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:AccTestApp"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <local:GetAccValues/>
</Window.DataContext>

之后,在initCommand的getter中设置一个断点,以确保它被调用。应在创建窗口时对其进行初始化。

如果这样做有效,您可以通过在应用程序资源中设置数据上下文并仅将其用作视图中的静态资源,使视图和ViewModel之间的关系更加不耦合。您可以在此处找到此方法的详细信息:https://stackoverflow.com/a/4590558/3330348

绑定表达式指示UI在窗体的DataContext上查找属性。

为了得到你想要的结果,你需要在你的构造函数中这样做:

public AccView()
{
  this.DataContext = this;
}

当AccView实例计算绑定表达式时,这告诉运行时查看该实例。