我正在使用带有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>
答案 0 :(得分:1)
public bool isChecked
{
get { return _isChecked; }
set
{
SetProperty(ref _isChecked, value);
checkedEvent?.Invoke(this, new EventArgs());
OnPropertyChanged("isChecked");
}
}
您还可以使用OnPropertyChanged事件来通知属性更改
答案 1 :(得分:0)
您可以直接从复选框的Click事件中调用ViewModel方法。
Click="{x:Bind ViewModel.DoSomething}"
答案 2 :(得分:0)
两件事:
删除双向组件。在事件中无法正常工作。最多可以使其成为OneWay,最好是一次。
X:Bind可以将事件绑定到异步任务吗?您可能必须将其设为异步void,但还是请尝试