2010-06-07 79 views
4

我有一个复杂的值对象类,它具有1)数字或只读属性; 2)私人构造函数; 3)许多静态单例实例属性[因此ComplexValueObject的属性永不改变,并且在应用程序的生命周期中一次实例化一个单独的值]。XAML绑定到复杂值对象

public class ComplexValueClass 
{ 
    /* A number of read only properties */ 
    private readonly string _propertyOne; 
    public string PropertyOne 
    { 
     get 
     { 
      return _propertyOne; 
     } 
    } 

    private readonly string _propertyTwo; 
    public string PropertyTwo 
    { 
     get 
     { 
      return _propertyTwo; 
     } 
    } 

    /* a private constructor */ 
    private ComplexValueClass(string propertyOne, string propertyTwo) 
    { 
     _propertyOne = propertyOne; 
     _propertyTwo = PropertyTwo; 
    } 

    /* a number of singleton instances */ 
    private static ComplexValueClass _complexValueObjectOne; 
    public static ComplexValueClass ComplexValueObjectOne 
    { 
     get 
     { 
      if (_complexValueObjectOne == null) 
      { 
       _complexValueObjectOne = new ComplexValueClass("string one", "string two"); 
      } 
      return _complexValueObjectOne; 
     } 
    } 

    private static ComplexValueClass _complexValueObjectTwo; 
    public static ComplexValueClass ComplexValueObjectTwo 
    { 
     get 
     { 
      if (_complexValueObjectTwo == null) 
      { 
       _complexValueObjectTwo = new ComplexValueClass("string three", "string four"); 
      } 
      return _complexValueObjectTwo; 
     } 
    } 
} 

我有一个数据上下文类,它看起来是这样的:

public class DataContextClass : INotifyPropertyChanged 
{ 


    private ComplexValueClass _complexValueClass; 
    public ComplexValueClass ComplexValueObject 
    { 
     get 
     { 
      return _complexValueClass; 
     } 
     set 
     { 
      _complexValueClass = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("ComplexValueObject")); 
     } 
    } 
} 

我想编写一个XAML约束力的声明的属性我复杂的值对象上更新UI每当整复杂的价值对象变化。什么是最好的和/或最简洁的做法?我有类似:

<Object Value="{Binding ComplexValueObject.PropertyOne}" /> 

但用户界面不会更新时ComplexValueObject作为一个整体的变化。

回答

3

您的原始方案应该工作得很好,因为在大多数情况下,Bindings可以识别其属性路径任何部分的更改通知。实际上,我尝试了您发布的代码进行确认,并确实可以正常工作。

您的剥离样本中是否可能没有其他复杂性?主要的我可以想到的是collections-> ItemsSource绑定,但可能有一些与您将属性分配给绑定值的属性有关(因为它显然不是对象)或其他东西。

1

您不通知PropertyOne的更改,以便UI不会更新。而是绑定到ComplexValueObject并使用值转换器来获取属性值。

<Object Value="{Binding Path=ComplexValueObject, Converter={StaticResource ComplexValueConverter}, ConverterParameter=PropertyOne}" /> 

public class ComplexValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    ComplexValue cv = value as ComplexValue; 
    string propName = parameter as string; 
    switch (propName) 
    { 
     case "PropertyOne": 
     return cv.PropertyOne; 
     case "PropertyTwo": 
     return cv.PropertyTwo; 
     default: 
     throw new Exception(); 
    } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    throw new NotImplementedException(); 
    } 
} 
+0

这确实有用。我想知道是否有纯粹的XAML方式来完成同样的事情。 – Gus 2010-06-07 18:03:44

+0

你的意思是根本没有代码,并保持你的数据类是?使用ComplexValueClass类型的依赖项属性编写用户控件,当依赖项属性发生更改时,该属性将自行失效。 – 2010-06-07 20:57:28

0

您需要在Complex类上使用INotifyPropertyChanged。如果您重新指定父项中的整个属性,则唯一通知,如果您要绑定到它们,那么该子类的属性需要通知to0。