2012-06-13 60 views
0

一個相當新手的問題,我敢肯定,但我無法找到答案...
我有一個控制(在這種情況下,一個組合框),這是綁定到視圖模型屬性:從ViewModel取消編輯事件

<ComboBox 
     x:Name="methodTypeCmb" 
     Grid.Row="0" Grid.Column="2" 
     ItemsSource="{Binding Path=AllNames, Mode=OneTime}" 
     SelectedItem="{Binding Path=Name, ValidatesOnDataErrors=True, Mode=TwoWay}" 
     Validation.ErrorTemplate="{x:Null}" 
     /> 

在我的ViewModel,當此屬性的變化,我想要求用戶確認更改。
如果用戶點擊「否」,我想取消更改。
但是,我必須做錯了什麼,因爲我的觀點不會在取消更改時恢復到以前的值。

視圖模型的財產:

public string Name 
{ 
    get { return m_model.Name; } 
    set 
    { 
     if (MessageBox.Show("Are you absolutely sure?","Change ",MessageBoxButton.YesNo) == MessageBoxResult.Yes) 
     { 
      // change name 
     } 
     base.OnPropertyChanged("Name"); 
    } 
} 
+0

什麼確切您使用的控制,什麼可編輯的屬性是你綁定的意思是用戶如何從UI設置值? – jimmyjambles

+0

我正在使用組合框。我會嘗試給你的代碼片段,並會讓你知道。謝謝! –

回答

0

因爲你的文字改變事件,WPF忽略屬性更改事件的範圍之內取消。你必須從調度

 Dispatcher.CurrentDispatcher.BeginInvoke((ThreadStart)delegate 
     { 
      OnPropertyChanged("Name"); 
     }); 

你應該離開你現有的「OnPropertyChanged(」名稱「)稱之爲」;在函數的底部就在上述命令行添加到您要取消

編輯塊:下面的代碼工作我測試

 public string Newtext 
     { 
      get 
      { 
       return this._newtext; 
      } 
      set 
      { 
       if (MessageBox.Show("Apply?", "", MessageBoxButton.YesNo) == MessageBoxResult.Yes) 
       { 
        this._newtext = value; 
        this.OnPropertyChanged("Newtext"); //Ignored 
       } 
       else 
       { 
        Dispatcher.CurrentDispatcher.Invoke((ThreadStart)delegate 
        { 
         OnPropertyChanged("Newtext"); 
        }); 
       } 
      } 
     } 
+0

使用了'Dispatcher.CurrentDispatcher'。沒有工作。但是我認爲你在改變事件 –

+0

的想法是正確的軌道上工作正常,在我的最後,張貼了一個功能片段的測試訪問者,我在視圖模型上使用。 「CurrentDispatcher」遺漏的道歉,必須複製錯誤的片段。 – jimmyjambles

+0

我正在使用TextBox進行測試,看起來所有控件的行爲都不一樣,請參閱上面對問題的評論。 – jimmyjambles