我必须使用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。在这种情况下问题在哪里?
答案 0 :(得分:0)
绑定表达式指示UI在表单的DataContext上查找属性。
要获得所需的结果,您需要在构造函数中执行此操作:
public AccView()
{
this.DataContext = this;
}
它告诉运行时在评估绑定表达式时查看AccView实例。
答案 1 :(得分:0)
看起来你错过了DataContext
。在您提到的评论中,GetAccValues
是您的ViewModel。您可以在codebehind中设置它。喜欢NSFW的回答。只将其设置为ViewModel的实例,而不是View视图本身。
或者,您可以在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中设置断点,以确保调用它。它应该在创建窗口时初始化。
如果可行,您可以通过在应用程序资源中设置数据上下文来使View和ViewModel之间的关系更少耦合,并仅将其用作View中的静态资源。您可以在此处找到此方法的详细信息:https://stackoverflow.com/a/4590558/3330348