2012-04-08 3 views
2

У меня есть кнопка, содержимое которой привязано к свойству ViewModel, называемому Test.RaisePropertyChanged не работает

<Button Content="{Binding Test, Mode=TwoWay}" 
      Name="button1"Click="button1_Click" /> 

По щелчку кнопки я меняю его содержание

private void button1_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    button1.Content = "Yellow"; 
} 

Но в собственность сеттер Я хотел бы переопределить содержание быть установлен и установить свой собственный контент. Ниже приводится код же:

string _test; 
public string Test 
{ 
    get 
    { 
     return _test; 
    } 
    set 
    { 
     _test = "Something" + System.DateTime.Now.ToString(); 
     RaisePropertyChanged(() => Test); 
    } 
} 

Теперь проблема содержания кнопки становится установлен как «желтый» вместо того, что это должно быть что-то вроде «Что-то ...»

Если я связываю это свойство с текстовым полем одновременно, там значение отображается корректно.

Примечание: Это всего лишь пример, и мой вопрос задан raisepropertychanged.

Пожалуйста, помогите.

+0

Действительно ли ваш сеттер устанавливает поле под названием 'test', или это должно быть' _test', как используется геттером? –

+0

Да, это _test. Извините за опечатку. Я исправил его в своем вопросе – NoDisplay

ответ

0

Спасибо всем за ваши ответы. Я понял, что он работал, когда вы запускаете его в режиме Non-debug. Но в случае Call Back он не будет работать даже в режиме без отладки.

я, наконец, получил решение, которое упоминается в статье http://info.titodotnet.com/2011/08/silverlight-dependency-property-clr.html

Ура!

1

Это действительно странный сеттер, вы действительно не должны делать что-то подобное. Если бы я установил Test = "Yellow", я бы ожидал, что это будет Yellow, а не что-то совсем другое. Вы должны поместить код, который обновляет свойство в отдельный метод и вызовите из обработчика событий:

string _test; 
public string Test 
{ 
    get 
    { 
     return _test; 
    } 
    private set 
    { 
     _test = value; 
     RaisePropertyChanged(() => Test); 
    } 
} 

public void UpdateTest() 
{ 
    Test = "Something" + System.DateTime.Now.ToString(); 
} 

private void button1_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    UpdateTest(); 
} 
+0

На самом деле у меня есть некоторые проверки, которые необходимо выполнить перед установкой свойства, если проверка правильна только тогда, когда я разрешу изменять свойство. – NoDisplay

1

Я подозреваю, что ваш

button1.Content = "Yellow"; 

является удаление привязки к вашему ViewModel.

Вы не должны указывать содержимое button1 непосредственно в представлении, а скорее устанавливать содержимое ViewModel, которое будет соответствующим образом обновлять представление.

+0

Точно, вы хотите обновить содержимое кнопки, измените значение свойства «Тест», с которым вы связываетесь. Привязка автоматически обновит button1.Content. – Alain

+0

Нет, он не удалит привязку. Однако я только что понял, что это отлично работает в режиме без отладки. – NoDisplay

+0

Это допустимый сценарий, когда у вас есть настраиваемый элемент управления вместо кнопки. Поскольку в пользовательском элементе управления вы можете иметь несколько кнопок и хотите обновить свойство, а при изменении свойства потребитель пользовательского элемента управления будет проверять и возвращать то же самое. – NoDisplay

Смежные вопросы