WPF Binding,OneWayToSource,“未找到Property Get方法”。

时间:2010-08-26 20:31:01

标签: c# wpf binding

我在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的值。

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

我在这里做了一些明显错误的事吗?

谢谢!

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

4 个答案:

答案 0 :(得分:1)

我尝试了一些东西,下面的代码可行。我希望这会有所帮助:

代码隐藏:


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>

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我不完全确定问题是什么,但你绝对可以在没有吸气剂的情况下捆绑OneWayToSource。我认为这个问题与你将Tag(类型为对象)绑定到SomeCustomType属性这一事实有关。您可能必须使用ValueConverter才能使其正常工作。

答案 3 :(得分:0)

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