【问题标题】:Is it bad pratice to call a method from a CheckBox in UWP从 UWP 中的 CheckBox 调用方法是不好的做法吗
【发布时间】: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 实现。

标签: mvvm uwp


【解决方案1】:
public bool isChecked
    {
        get { return _isChecked; }
        set
        {
            SetProperty(ref _isChecked, value);
            checkedEvent?.Invoke(this, new EventArgs());
            OnPropertyChanged("isChecked");
        }
    }

您也可以使用 OnPropertyChanged 事件来通知属性更改

【讨论】:

    【解决方案2】:

    您可以直接从 Checkbox 的 Click 事件中调用 ViewModel 方法。

            Click="{x:Bind ViewModel.DoSomething}"
    

    【讨论】:

      【解决方案3】:

      两件事:

      • 移除双向部分。它不能在事件中工作。如果可以的话,最多让它成为 OneWay,最好的 OneTime。

      • X:Bind 可以将事件绑定到异步任务吗?您可能必须将其设为 async void,但无论如何都要尝试

      【讨论】:

        猜你喜欢
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        相关资源
        最近更新 更多