绑定到不同的dataContexts

时间:2011-08-30 13:18:31

标签: data-binding windows-phone-7 mvvm

Windows Phone应用程序(Silverlight 3)

我有一个文本块

<TextBlock Text="{Binding Key}"  FontSize="40" Foreground="{Binding propertyOnAMainViewModel}" />

TextBlock的DataContext设置为一个类Group实例,它公开Key属性。

我需要将TextBlock的foreground属性绑定到动态(可设置的代码)属性,但是在不同的ViewModel上,而不是Group。

是否可以将一个元素上的不同属性绑定到不同的数据上下文?

2 个答案:

答案 0 :(得分:2)

你可以这样做,但它不是非常优雅!每个绑定都有一个Source,如果没有指定,则是控件的DataContext。如果在代码隐藏中构造绑定,则可以显式设置源。在XAML中,您唯一的选项是默认(即DataContext)或ElementName绑定。

我要做的是创建一个ViewModel,它公开您希望绑定的属性,并将其用作DataContext

答案 1 :(得分:0)

如果您可以将一个VM托管在另一个VM中,这是最简单的:

public class TextBoxViewModel : ViewModelBase
{
  private ChildViewModel _childVM;

  public ChildViewModel ChildVM
  {
    get { return _childVM; }
    set
    {
      if (_childVM == value)
        return;

      if (_childVM != null)
        _childVM.PropertyChanged -= OnChildChanged;

      _childVM = value;

      if (_childVM != null)
        _childVM.PropertyChanged += OnChildChanged;

      OnPropertyChanged("ChildVM");
    }
  }

  public Brush TextBoxBackground
  {
    get
    {
      if(ChildVM == null)
        return null;

      return ChildVM.MyBackground;
    }
    set
    {
      if (ChildVM != null)
        ChildVM.MyBackground = value;
    }
  }

  private void OnChildChanged(object sender, PropertyChangedEventArgs e)
  {
    if (string.IsNullOrEmpty(e.PropertyName) || e.PropertyName == "MyBackground")
      OnPropertyChanged("TextBoxBackground");
  }
}