2016-08-01 82 views
0

我有一個使用MVVM的WPF應用程序。我的ViewModel上的模型實例上綁定了一個布爾值的IsChecked值。我還需要將ViewModel上的方法綁定到Checked和Unchecked事件。 (這是這樣我就可以跟蹤未保存的更改和改變背景給我的用戶需要保存視覺指示我想:複選框上的雙重綁定

<CheckBox 
    Content="Enable" 
    Margin="5" 
    IsChecked="{Binding Enabled}" 
    Checked="{Binding ScheduleChanged}" 
    Unchecked="{Binding ScheduleChanged}" 
    /> 

但我得到一個System.Windows.Data「上提供價值」。 ?結合「拋出一個異常」的錯誤建議

這裏是我一起工作的型號:

public class Schedule : IEquatable<Schedule> 
{ 
    private DateTime _scheduledStart; 
    private DateTime _scheduledEnd; 
    private bool _enabled; 
    private string _url; 
    public DateTime ScheduledStart 
    { 
     get { return _scheduledStart; } 
     set 
     { 
      _scheduledStart = value; 
     } 
    } 
    public DateTime ScheduledEnd 
    { 
     get { return _scheduledEnd; } 
     set 
     { 
      if(value < ScheduledStart) 
      { 
       throw new ArgumentException("Scheduled End cannot be earlier than Scheduled Start."); 
      } 
      else 
      { 
       _scheduledEnd = value; 
      } 
     } 
    } 
    public bool Enabled 
    { 
     get { return _enabled; } 
     set { _enabled = value; } 
    } 
    public string Url 
    { 
     get { return _url; } 
     set { _url = value; } 
    } 

    public bool Equals(Schedule other) 
    { 
     if(this.ScheduledStart == other.ScheduledStart && this.ScheduledEnd == other.ScheduledEnd 
      && this.Enabled == other.Enabled && this.Url == other.Url) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

我的視圖模型包含有一個ObservableCollection屬性一個ItemsControl綁定到集合並生成。 list。所以我的ViewModel有點了解我的Model實例,b我不認爲哪一個是不知道的。

回答

0

你應該能夠公正處理這二傳手啓用後...

public class MyViewModel : ViewModelBase 
{ 

    private bool _isDirty; 
    private bool _enabled; 

    public MyViewModel() 
    { 
     SaveCommand = new RelayCommand(Save, CanSave); 
    } 

    public ICommand SaveCommand { get; } 

    private void Save() 
    { 
     //TODO: Add your saving logic 
    } 

    private bool CanSave() 
    { 
     return IsDirty; 
    } 

    public bool IsDirty 
    { 
     get { return _isDirty; } 
     private set 
     { 
      if (_isDirty != value) 
      { 
       RaisePropertyChanged(); 
      } 
     } 
    } 

    public bool Enabled 
    { 
     get { return _enabled; } 
     set 
     { 
      if (_enabled != value) 
      { 
       _enabled = value; 

       IsDirty = true; 
      } 

      //Whatever code you need to raise the INotifyPropertyChanged.PropertyChanged event 
      RaisePropertyChanged(); 
     } 
    } 
} 

你得到一個綁定錯誤,因爲你無法控制的事件直接綁定到一個方法調用。

編輯:添加了一個更完整的示例。

該示例使用MVVM Lite framework,但該方法應適用於任何MVVM實現。

+0

謝謝你的答覆。我有這個綁定工作,但是,我希望能夠跟蹤其他領域的價值變化。一個文本框和來自Xceed的幾個DateTimePicker。所有這一切都是爲了設置一個標誌,用於觸發背景顏色的變化,如果有事情發生變化並且保存按鈕尚未被點擊。 –

+0

@AaronRumford我剛剛添加了更多的細節。您可以使用綁定到上面的IsDirty屬性的樣式DataTrigger來更改UI的外觀。 – RQDQ

1

CheckedUnchecked是事件,所以你不能綁定到他們,就像你可以IsChecked,這是一個屬性。在更高級別上,對於視圖模型來說,不要了解視圖上的複選框也可能是明智的。

我會在視圖模型上創建一個事件,當啓用更改時觸發,並且您可以訂閱並按照您喜歡的方式處理它。

private bool _enabled; 

public bool Enabled 
{ 
    get 
    { 
     return _enabled; 
    } 
    set 
    { 
     if (_enabled != value) 
     { 
      _enabled = value; 
      RaisePropertyChanged("Enabled"); 
      if (EnabledChanged != null) 
      { 
       EnabledChanged(this, EventArgs.Empty); 
      } 
     } 
    } 
} 

public event EventHandler EnabledChanged; 
// constructor 
public ViewModel() 
{ 
    this.EnabledChanged += This_EnabledChanged; 
} 

private This_EnabledChanged(object sender, EventArgs e) 
{ 
    // do stuff here 
} 
+0

啓用是不知道ViewModel模型的一部分。我怎樣才能訂閱甚至在viewModel? –

+0

上面的EnabledChanged事件是公共的。如果你的視圖模型有你的模型的一個實例,你可以訂閱它,比如model.EnabledChanged + = Model_EnabledChanged - 它是一個標準的c#事件。 – plast1k

+0

我在原始問題中添加了模型和我的問題的進一步解釋。 –