2014-02-09 6 views
0

Вопрос был дан ответ в другой теме, но я не получаю полный ответ. Я сделал несколько прогулок и работу, но я не очень доволен этим. Так что я спрашиваю, как это сделать в MVVM patern.Как стать резидентом. Отменить из фоновой темы.

У меня очень неприятные проблемы с обновлением значения в текстовом поле в представлении. Сообщение Proprerty обновляется с моего обратного вызова, но не отображается в графическом интерфейсе. Свойство правильно привязано. Теперь я могу это сделать. Причина в том, что im не поднимает PropertyChanged в потоке пользовательского интерфейса, так как im вызывает его из обратного вызова. Я пытаюсь, но ничего не работает. Как повысить событие PropertyChange в потоке пользовательского интерфейса?

EDIT СНОВА ОБНОВИТЬ КОД:

namespace test 
{ 
    public class MainViewModel : INotifyPropertyChanged, IDataExchangeCallback 
    { 
     public MainViewModel() 
     { 
      Message = "TEST1"; 
     } 

     void IDataExchangeCallback.Result(string result) 
     { 
      Message += result; 
     } 

     public void Register() 
     { 
      InstanceContext instanceContext = new InstanceContext(new MainViewModel()); 
      DataExchangeClient client = new DataExchangeClient(instanceContext); 

      client.RegisterClient(Guid.NewGuid().ToString()); 
     } 

     private string _message; 
     public string Message 
     { 
      get { return this._message; } 
      set 
      { 
       if (this._message != value) 
       { 
        this._message = value; 
        OnPropertyChanged("Message"); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; //ALWAYS NULL!!! BUT I HAVE INotifyPropertyChanged implement 
     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       Application.Current.Dispatcher.Invoke(() => 
        handler(this, new PropertyChangedEventArgs(name))); 
      } 
     } 
    } 
} 

Мой PropertChange всегда нуль. ЗАЧЕМ? Когда я использую привязки, я могу подписаться на PropertyChanged.

EDIT Я все еще нужна помощь

+0

Я не рядом с VS прямо сейчас, но у вас есть решение частично намеченному: Application.Current.Dispatcher.Invoke ((Action) (() => {обработчик (это, новые PropertyChangedEventArgs (ИмяСвойства))}); –

+0

Это не ** работает, и я не знаю почему. – UserBuzzer

+0

Не совсем уверен, но может быть, вы передаете новый экземпляр MainViewModel в: InstanceContext? Пробовали ли вы передавать: экземпляр экземпляра Экземпляр = new InstanceContext (this); – rauland

ответ

0

Найдено решение!

По-видимому, если вы хотите использовать INotifyPropertyChanged, вам необходимо называть его явно в коде.

это.DataContext = mvm;

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     MainViewModel mvm = new MainViewModel(); 
     mvm.Register(); 

     this.DataContext = mvm; //this you need 
    } 
} 

Декларация в XAML не является достаточным:

<Window.DataContext> 
    <local:MainViewModel/> 
</Window.DataContext> 

Если кто-то может объяснить мне, почему я был бы благодарен?

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