【问题标题】:InvalidOperationException - A TwoWay or OneWayToSource binding cannot work on the read-only propertyInvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作
【发布时间】:2012-02-05 02:04:33
【问题描述】:

我正在使用 MVVM 模式,当我运行我的应用程序时收到以下信息

无效操作异常 TwoWay 或 OneWayToSource 绑定无法在“ViewModel.SynergyViewModel”类型的只读属性“Options”上工作。

我已经在我的视图模型中注释掉了我所有的源代码,并把它追溯到了一个复选框。如果我在应用程序运行的视图模型中注释掉复选框或属性,减去功能。下面我列出了我的复选框和视图模型中的属性的代码。

<CheckBox Grid.Column="4" HorizontalAlignment="Right" Margin="5,0,5,5" IsChecked="{Binding Options}" Content="Options"/>
private bool _Options;
public bool Options
{
    get
    {
        return _Options;
    }
    private set
    {
        if (_Options == value)
            return;

        _Options = value;
        OnPropertyChanged("Options");
    }
}

发生 System.InvalidOperationException Message=A TwoWay 或 OneWayToSource 绑定无法在“ViewModel.MyViewModel”类型的只读属性“Options”上工作。 来源=PresentationFramework 堆栈跟踪: 在 MS.Internal.Data.PropertyPathWorker.CheckReadOnly(对象项,对象信息) 内部异常:

关于我在这里缺少什么的任何想法?

【问题讨论】:

标签: c# wpf xaml data-binding mvvm


【解决方案1】:

要么公开你的 setter,要么明确地将 Binding.Mode 设置为 OneWay

【讨论】:

  • 如果您在安装了 .net 4.5 的机器上开发 .net 4.0 WPF 项目,您在开发过程中不会遇到此错误!微软需要解决这个问题。
  • 很奇怪,我在使用内部设置器时遇到了同样的错误......我本以为允许使用内部设置器,但奇怪的是没有。
  • 我希望这个答案能指定如何将 Binding.Mode 设置为 OneWay - 我在哪里可以做到这一点?在集合中?
  • IsChecked="{Binding Options, Mode=OneWay}"
【解决方案2】:

您的 setter 是私有的,要么将绑定指定为模式 OneWay,要么从 setter 中删除私有

【讨论】:

    【解决方案3】:

    在我绝对愚蠢的情况下,我忘记为属性定义一个设置器,使它成为只读的。对于那些工作太晚的人,只需我的 2 美分。

    【讨论】:

      【解决方案4】:

      对于那些没有使用PropertyChanged而发现此内容的人

      无论是否使用PropertyChanged,当您有一个计算属性(没有setter)并且用户尝试编辑该列时,也会引发此异常。将整个 DataGrid 设置为 IsReadOnly="True" 或仅将列设置为 ReadOnly 就足够了。

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 2019-02-08
        • 2019-11-21
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 2015-03-14
        • 2011-04-04
        相关资源
        最近更新 更多