【发布时间】:2018-10-04 14:10:10
【问题描述】:
我正在使用 Prism 和 MVVM 学习 UWP。我想使用复选框调用我的 ViewModel 的方法。这是 ViewModel。
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
}
public async Task DoSomething()
{
await Task.Delay(5000);
}
}
我希望像这样直接从 xaml 调用此方法:
<Grid>
<CheckBox x:Name="chkBox" Checked="{x:Bind ViewModel.DoSomething,Mode=TwoWay}" Content="Click me!"
HorizontalAlignment="Left" Margin="118,90,0,0" VerticalAlignment="Top" ></CheckBox>
</Grid>
当我运行应用程序时出现错误:
Error TwoWay binding target 'Checked' must be a dependency property
这是什么意思?
我应该将 IsChecked 属性绑定到 ViewModel 并引发事件吗?:
public class MainViewModel : ViewModelBase
{
private bool _isChecked;
event EventHandler checkedEvent;
public bool isChecked
{
get { return _isChecked; }
set
{
SetProperty(ref _isChecked, value);
checkedEvent?.Invoke(this, new EventArgs());
}
}
public MainViewModel()
{
checkedEvent += MainViewModel_checkedEvent;
}
private async void MainViewModel_checkedEvent(object sender, EventArgs e)
{
await DoSomething();
}
public async Task DoSomething()
{
await Task.Delay(5000);
}
}
Xaml:
<Grid>
<CheckBox x:Name="chkBox" IsChecked="{x:Bind ViewModel.isChecked,Mode=TwoWay}" Content="Click me!" HorizontalAlignment="Left" Margin="118,90,0,0" VerticalAlignment="Top" ></CheckBox>
</Grid>
【问题讨论】:
-
是的,您回答了自己的问题,您应该始终以属性而不是方法绑定两种方式,并且在设置属性时,您可以像已经在做的那样引发事件,甚至可以探索uwp 应用中的 ICommand 实现。