Привязка XAML к объектам со сложным значением - PullRequest
4 голосов
/ 07 июня 2010

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

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

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

Ответы [ 3 ]

3 голосов
/ 08 июня 2010

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

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

1 голос
/ 07 июня 2010

Вы не уведомляете об изменениях в 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 голосов
/ 22 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...