Привязка WPF, OneWayToSource, «Метод получения свойства не найден». - PullRequest
0 голосов
/ 27 августа 2010

У меня есть открытое свойство CLR, определенное в коде за окном WPF. Для этого свойства определен только сеттер.

public SomeCustomType SomeProperty {
    set {
        someValue = value;
    }
}

У меня также есть ComboBox, определенный в XAML этого окна WPF. Этот ComboBox имеет два определенных объекта ComboBoxItem. Свойства содержимого объектов ComboBoxItem установлены на текст, который я хочу отобразить для этих элементов. Свойства тега объектов ComboBoxItem устанавливаются в статическое свойство CLR другого класса. SelectedValuePath установлен на «Tag» в ComboBox. У меня есть SelectedValue, привязанное к свойству 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, свойство CLR в коде окна должно быть установлено на выбранное значение. Я не хочу, чтобы код всегда устанавливал значение ComboBox.

Но когда я запускаю это, я получаю исключение: «Метод Get Property не найден». То, как я это читаю, жалуется, что у меня нет геттера, определенного в свойстве CLR Window. Но я не думаю, что мне это нужно.

Я что-то здесь не так делаю?

Спасибо!

РЕДАКТИРОВАТЬ: я должен упомянуть, что добавление геттера делает это работает, но геттер получает удар всякий раз, когда сеттер делает. Кроме того, при первом вызове установщика (при загрузке окна) значение равно нулю. Но тогда он не будет вызываться снова, пока пользователь не выберет что-то. Разве я не должен получать действительное значение из выбранного значения в первый раз?

Ответы [ 4 ]

1 голос
/ 27 августа 2010

Я попробовал что-то, и код ниже работает. Надеюсь, это поможет:

Код-Behind:


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 голос
/ 06 февраля 2014

Я знаю, что это довольно старо, но я думал, что упомяну, что я получил ту же проблему в моем источнике Я обнаружил, что это было одно из свойств в классе, который я искал, имел установщик, но не получатель. Я добавил геттер, и проблема решена.

0 голосов
/ 23 февраля 2014

Установите свойства вашего базового класса getter и setter на protected.

0 голосов
/ 27 августа 2010

Я не совсем уверен, в чем проблема, но вы, безусловно, можете привязать OneWayToSource без получения. Я думаю, что проблема связана с тем, что вы связываете тег (типа объекта) со свойством SomeCustomType. Возможно, вам придется использовать ValueConverter, чтобы заставить это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...