将Caliburn.Micro中的保护属性绑定到视图模型中对象的属性

时间:2011-08-18 07:04:39

标签: wpf caliburn.micro

我有一个看起来像这样的ViewModel类。

class MyViewModel : Screen
{
  public BindableCollection<MyObject> MyObjects { get; set; }

  private MyObject selectedObject;
  public MyObject SelectedMyObject
  {
    get { return selectedObject; }
    set
    {
      selectedObject = value:
      //some additional unrelated logic
    }
  }

  public void SaveObject()
  {
    //some logic
  }
  public bool CanSaveObject{
    get{
      //logic to determine if the selectedObject is valid
    }
  }

这是相关的代码。现在问题。

MyObject是一个包含三个属性的类。在视图中,我有一个绑定到MyObjects集合的ListView,以及绑定到SelectedItemListView的三个TextBox。

当我填写文本框时,相关对象在模型中被更改,但我想确保对象处于有效状态,然后才能保存它。 CanSaveObject具有必要的逻辑,但问题是永远不会被调用,因为当文本框被填充时我没有任何机会调用NotifyOfPropertyChanged,因为只调用了selectedObject的属性,并且没有MyViewModel上的属性。

所以问题是:如果没有在ViewModel上创建封装MyObject内的属性的属性,有没有什么好方法可以做到这一点。

如果我创建这样的属性,然后在视图中直接绑定到这些而不是SelectedItem,我已经得到了它,但是如果像这样的黑客是唯一的方法,那么viewmodel会匆忙搞得一团糟去做吧。我希望不是:)

public string SelectedObjectPropertyOne{
  get{ return selectedObject.PropertyOne; }
  set{
    selectedObject.PropertyOne = value;
    NotifyOfPropertyChange(() => SelectedObjectPropertyOne);
    NotifyOfPropertyChange(() => CanSaveObject);
  }
}

1 个答案:

答案 0 :(得分:2)

ActionMessage.EnforceGuardsDuringInvocation是一个静态布尔字段,可以设置为在即将调用操作时强制执行保护检查。这将保护实际的Save操作不被调用,但是在更新所选模型之后立即基于保护状态的UI外观问题将无法解决。

如果不这样做,我可以建议的唯一其他修改是为MyObject模型创建VM类型并移动验证并在那里保存逻辑。这也可以让你简化你的观点......