XAML绑定到复杂值对象

时间:2010-06-07 14:26:14

标签: c# wpf xaml oop binding

我有一个复杂的值对象类,它有1)一个数字或只读属性; 2)私人建设者; 3)许多静态单例实例属性[因此ComplexValueObject的属性永远不会改变,并且在应用程序的生命周期中将单个值实例化一次]。

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整体发生变化时,UI不会更新。

3 个答案:

答案 0 :(得分:3)

您的原始方案应该可以正常工作,因为在大多数情况下,绑定会识别其属性路径的任何部分的更改通知。事实上,我试用了你发布的代码进行确认,它确实可以正常工作。

您的剥离样本中是否还有其他复杂问题?我能想到的主要部分是collections-&gt; ItemsSource Bindings,但是可能存在与你为绑定值赋值的属性相关的东西(因为它显然不是Object)或其他东西。

答案 1 :(得分: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();
  }
}

答案 2 :(得分:0)

您的Complex类需要INotifyPropertyChanged。如果您重新分配父项中的整个属性,则通知该子类的属性,如果要绑定它们,则需要通知to0。