2010-06-07 5 views
4

У меня есть класс объектов комплексного значения, который имеет 1) число или свойства только для чтения; 2) частный конструктор; и 3) количество статических свойств экземпляра singleton [поэтому свойства объекта 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 привязку заявления свойства на моем сложном объекте значения, который обновляет пользовательский интерфейс, когда все изменения объектов комплексного значения. Каков наилучший и/или самый лаконичный способ сделать это? У меня есть что-то вроде:

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

но пользовательский интерфейс не обновляется, когда ComplexValueObject в целом изменяется.

ответ

3

Ваш исходный сценарий должен работать нормально, потому что в большинстве случаев привязки распознают уведомления об изменениях на любой части пути их свойств. Я на самом деле попробовал код, который вы отправили, чтобы подтвердить, и он работает нормально.

Есть ли другие сложности, которые вы не можете выразить в своем убранном образце? Первичный, о котором я могу думать, это коллекции -> ItemsSource Bindings, но может быть что-то связанное с свойством, которому вы назначаете связанное значение (так как это явно не объект) или что-то еще.

1

Вы не уведомляете об изменениях в PropertyOne, поэтому пользовательский интерфейс не будет обновляться. Вместо этого свяжите с 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

+0

Вы имеете в виду без кода вообще и сохранить свои классы данных, как есть ??? Напишите пользовательский элемент управления с свойством зависимости типа ComplexValueClass, который будет аннулировать себя при изменении свойства зависимостей. –

0

Вам нужен INotifyPropertyChanged на вашем сложном классе. Единственное уведомление, если вы переназначить все свойство в родительском, свойства этого дочернего класса должны уведомить to0, если вы собираетесь связываться с ними.

Смежные вопросы