2016-08-01 85 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

我在原始问题中添加了模型和我的问题的进一步解释。 –