WPF 绑定,OneWayToSource,“找不到属性获取方法。”

Posted

技术标签:

【中文标题】WPF 绑定,OneWayToSource,“找不到属性获取方法。”【英文标题】:WPF Binding, OneWayToSource, "Property Get method was not found." 【发布时间】:2011-04-04 12:02:02 【问题描述】:

我在 WPF 窗口后面的代码中定义了一个公共 CLR 属性。该属性只定义了一个 setter。

public SomeCustomType SomeProperty 
    set 
        someValue = value;
    

我还在此 WPF 窗口的 XAML 中定义了一个 ComboBox。此 ComboBox 定义了两个 ComboBoxItem 对象。 ComboBoxItem 对象的 Content 属性设置为我要为这些项目显示的文本。 ComboBoxItem 对象的 Tag 属性设置为另一个类的静态 CLR 属性。 SelectedValuePath 在 ComboBox 上设置为“Tag”。我将 SelectedValue 绑定到 Window 的 CLR 属性,模式设置为 OneWayToSource,UpdateSourceTrigger 设置为 PropertyChanged。

<ComboBox SelectedValue="Binding Registry, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged" SelectedValuePath="Tag" SelectedIndex="0">
    <ComboBoxItem Content="Item1" Tag=x:Static someNamespace:SomeType.SomeStaticCLRProperty" />
    <ComboBoxItem Content="Item1" Tag=x:Static someNamespace:SomeType.SomeStaticCLRProperty" />
</ComboBox>

我想要发生的是:当在 ComboBox 中选择一个项目时,后面的 Window 代码中的 CLR 属性应该设置为选定的值。我不希望后面的代码设置 ComboBox 的值。

但是当我运行它时,我得到一个异常:“找不到属性获取方法。”。我读这篇文章的方式是抱怨我没有在 Window 的 CLR 属性上定义 getter。但我不认为我应该需要一个。

我在这里做错了什么吗?

谢谢!

编辑:我应该提到添加 getter 确实可以使它工作,但是只要 setter 这样做,getter 就会受到打击。此外,第一次调用 setter 时(当 Window 加载时),该值为 null。但是在用户选择某些东西之前,它不会再次被调用。我不应该第一次从所选值中获得有效值吗?

【问题讨论】:

OneWayToSource 已损坏。 ***.com/questions/4875751/… 【参考方案1】:

将您的基类属性 getter 和 setter 设置为 protected。

【讨论】:

【参考方案2】:

我知道这已经很老了,但我想我会提到我在源代码中收到了同样的问题。我发现它是我正在搜索的类中的属性之一,它有一个 setter 但不是 getter。我添加了一个 getter,问题就解决了。

【讨论】:

【参考方案3】:

我尝试了一些方法,下面的代码有效。我希望这会有所帮助:

代码隐藏:


public partial class MainWindow : Window
    
        private SomeCustomType registry;
        public SomeCustomType Registry  set  registry = value;  

        public MainWindow()
        
            InitializeComponent();
            this.comboBox.DataContext = this;
        

    

    public class SomeType
    
        public static SomeCustomType Property1  get  return new SomeCustomType()  Name = "Item1" ;  
        public static SomeCustomType Property2  get  return new SomeCustomType()  Name = "Item2" ;  
    

    public class SomeCustomType
    
        public string Name  get; set; 
    

XAML:

<ComboBox x:Name="comboBox" SelectedValue="Binding Registry, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged" 
              SelectedValuePath="Tag" SelectedIndex="0">
    <ComboBoxItem Content="Item1" Tag="x:Static local:SomeType.Property1" />
    <ComboBoxItem Content="Item2" Tag="x:Static local:SomeType.Property2" />
</ComboBox>

【讨论】:

确实,这也适用于我。现在要弄清楚我做了什么不同的事情!感谢您提醒我,有时只需进行一次简单的健全性检查即可回答我自己的问题。 如果有人来这里寻找我最初问题的答案,我在调试选项中启用了 Break On Exception。这段代码和我自己的代码都抛出了异常,但不是未处理。自从我问了这个问题以来,我已经在其他地方读到过,尽管您会怎么想,它实际上确实可以访问 getter。不过,它似乎没有使用该值,因此无需担心。奇怪...【参考方案4】:

我不完全确定问题出在哪里,但您绝对可以在没有 getter 的情况下绑定 OneWayToSource。我认为问题与您将标签(对象类型)绑定到 SomeCustomType 的属性有关。您可能必须使用 ValueConverter 才能使其工作。

【讨论】:

你好。感谢您的回答。我将属性更改为“对象”类型之一,然后对我的内部变量进行了“as”动态转换。这应该可以解决您提出的问题,不是吗?不幸的是,异常仍然存在。 你能发布你正在使用的完整课程和实际的 XAML 吗? 这是一个相当大的课程,但更重要的是,我在 NDA 下工作,所以我无法发布完整的课程。但是,上面的答案(健全性检查)似乎也对我有用,所以我想我至少从现在开始有一些工作要做。再次感谢您的帮助。

以上是关于WPF 绑定,OneWayToSource,“找不到属性获取方法。”的主要内容,如果未能解决你的问题,请参考以下文章

WPF .Net 4 - OneWayToSource 绑定到只写属性适用于某些机器!如何?

升级 .NET 版本后,TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

有哪些不同的 WPF 绑定模式?

无法数据绑定滑块 WPF 的值 [重复]

WPF的5种绑定模式(mode)

OneWayToSource 绑定似乎在 .NET 4.0 中被破坏