从UWP中的CheckBox调用方法是否很糟糕?

时间:2018-10-03 14:05:14

标签: mvvm uwp

我正在使用带有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>

3 个答案:

答案 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,但还是请尝试