【问题标题】:Get bool value of Checkbox in wpf with binding in mvvm C#通过 mvvm C# 中的绑定获取 wpf 中复选框的布尔值
【发布时间】:2020-06-18 23:38:01
【问题描述】:

我有以下代码:

视图模型:

DownloadDeviceViewModel : ViewModelBase
{
    private bool _isSelected;

    public bool isSelected
    {
        get
        {
            return _isSelected;
        }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged();

            }
        }
    }

    public void Method()
    {
        if(isSelected)
        {

        }
    }
}

XAML:

<CheckBox Content="Checkbox" IsChecked="{Binding isSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

onPropertyChanged 方法在 ViewModelBase 中。我没有插入它以使其更易于阅读。

每次我在方法中调用“isSelected”的值时,IsSelected 都会返回错误。 即使我选择了复选框并且 isSelected 的值设置为 true。

但在该方法中,该值变回 false。

我错误地实现了值总是更改为 false 的原因是什么?

谢谢大家

【问题讨论】:

  • 确保将 xaml 的 DataContext 设置为您正在使用的 DownloadDeviceViewModel 实例。
  • 是的,我已经设置了我的 DataContext。
  • PropertyChanged 是否正确实施?
  • 试试OnPropertyChanged(nameof(isSelected))

标签: c# wpf mvvm binding


【解决方案1】:

您的 ViewModel 必须是 INotifyPropertyChanged

DownloadDeviceViewModel : ViewModelBase, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string nomPropriete)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
    }
    private bool _isSelected;

    public bool isSelected
    {
        get
        {
            return _isSelected;
        }
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                NotifyPropertyChanged("isSelected");
            }
        }
    }

    public void Method()
    {
        if(isSelected)
        {

        }
    }
}

那么在你的 XAML 中,UpdateSourceTrigger 就不需要了

<CheckBox Content="Checkbox" IsChecked="{Binding isSelected}"/>

够了

【讨论】:

  • 方法 NotifyPropertyChanged 已经在 ViewModelBase 中。我没有在这里列出它,因为它会太多代码。
  • @Max 所以我猜你在ViewModelBase 上有一个错误,因为对我来说它工作得很好,检查当你选中/取消选中复选框时,你会通过NotifyPropertyChanged
【解决方案2】:

在您的设置器中,删除“if”条件,您不需要它。这可能会导致您的问题。

        set
        {
                _isSelected = value;
                OnPropertyChanged();
        }

【讨论】:

  • 不,这没有帮助。 if 条件仅适用于复选框的当前状态与想要的值没有不同的情况。例如如果我有一个“全选”按钮。然后我不需要触发 OnPropertyChanged。
  • 您确定将 DataContext 设置为 ViewModel 吗?
  • 是的,我已经设置了我的 DataContext。
  • Max,您发布的代码距离完整的示例项目仅一步之遥。我强烈建议您将问题隔离到一个仅包含复选框、视图模型和 ViewModelBase 的新项目中。如果问题仍然存在,请发布您的 MainWindow.xaml、MainWindow.xaml.cs 和您的 ViewModelBase。根据您发布的内容,没有明显错误。因此,问题可能出在您未发布的区域。
  • Tam Bui 我猜问题出在主窗口上。我想我对自定义控件的绑定错误,这会导致在我查询布尔值时创建第二个线程。我会尽量把我的 MainWindow 弄直。
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2018-06-08
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多