WPF绑定以表现OneWayToSource和OneTime

时间:2014-10-22 12:41:03

标签: c# wpf binding

控件绑定是否可能表现为OneWayToSourceOneTime

这是一些背景:我有一个数据网格。每行都有文本单元格和checkbox。如果选择checkbox,则会保存该行中的数据。现在,当用户开始键入任何文本单元格时,我更改了ViewModel中的IsChecked属性,以便检查checkbox。我希望这只发生一次。因此,例如,如果用户开始输入并决定取消选中checkbox我不想在用户再次开始输入值时更改它。

对我而言,设置与OneWayToSourceOneTime的绑定应该是一个解决方案,但我知道绑定模式只能设置为单个值。我一直在寻找一些建议和可能的解决方法,以达到类似的结果,但没有结果。

1 个答案:

答案 0 :(得分:1)

来自msdn

  

OneTime仅在应用程序启动时更新目标属性   或者当DataContext经历更改时

这意味着使用OneWayToSourceOneTime的组合无法解决您的问题,因为“一次性”更新不会触发属性第一次更改但在应用程序启动时或datacontext改变。

当您将文本单元格文本绑定到某个属性时,如果应设置IsChecked,则可以在该属性中进行控制。

private string text_ = "";
private bool isChecked_ = false;
private bool autoSetChecked_ = true;

public bool IsChecked
{
  get
  {
    return isChecked_;
  }
  set
  {
    if (isChecked_ == value) {
      return;
    }

    // If user manually changes check state assume the user wants to keep that state
    // => Disable auto changing.
    autoSetChecked_ = false;
    isChecked_ = value;
    OnPropertyChanged("IsChecked");
  }
}

public Text
{
  get
  {
    return text_;
  }
  set
  {
    if (text_ == value) {
      return;
    }

    text_ = value;
    OnPropertyChanged("Text");

    if (autoSetChecked_) {
      // Only set is checked if not done ever before.
      autoSetChecked_ = false;
      IsChecked = true;
    }
  }
}

修改:这需要您的IsChecked - Binding是TwoWay,因此您可以更改视图模型中的复选框。