我在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。但是在用户选择某些内容之前,它不会被再次调用。我不应该第一次从所选值中获得有效值吗?
答案 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。