WPF Представление расчетного свойства для привязки (как DependencyProperty)

Я имею сложный контроль WPF, который по некоторым причинам (т.е. производительность) не использует свойства зависимости, но простые свойства C# (по крайней мере, на верхнем уровне, они выставляются как свойства).

Цель состоит в том, чтобы позволить связать с некоторыми из тех высокоуровневых свойств-> я предполагаю, что должен объявить их как РАЗНОСТИ ПОТЕНЦИАЛОВ. (право? или есть ли некоторый другой способ достигнуть этого?)

Я начал читать на MSDN о DependencyProperties и DependencyObjects и нашел пример:

public class MyStateControl : ButtonBase
{
  public MyStateControl() : base() { }
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); } 
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}

Если я прав - этот код осуществляет свойство, которое будет сохранено DependencyProperty, который ограничивает его, чтобы быть простым свойством с хранилищем (с функциональной точки зрения, не технически) вместо способности вычислить значение свойства каждый раз, когда метод считывания называют и установка других свойств/полей каждый раз, когда метод set называют.

Что я могу сделать об этом? Есть ли какой-либо способ, которым я мог заставить те два мира встретиться в какой-то момент?

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

У меня есть TabControl, который связывается с набором ViewModel (я использую шаблон MVVM), объекты. Каждая вкладка предназначена, чтобы быть редактором для одного объекта того набора. Объекты могут иметь различные типы, таким образом, у меня есть повторные определения каждый с различным свойством DataType. Теперь я имею тот сложный Контроль WPF, который я хочу использовать в качестве части одного из тех DataTemplates. Если я использую обычный TextBox, я могу просто связать с его текстовым свойством, но я не могу сделать того же с текстовым свойством того пользовательского элемента управления просто, потому что его текстовое свойство не является свойством зависимости. В этом сценарии я имею:

  • никакой прямой доступ к самому управлению, ни к его событиям
  • никакой код позади не регистрирует, который я могу использовать, чтобы сделать такую вещь

Я вижу однако грязное решение -

  1. В классе Окна я должен был бы подписаться на событие CollectionChanged набора, который связывается с TabControl.
  2. Каждый раз, когда объект добавляется к тому использованию набора ItemContainerGenerator для получения копии, я предполагаю TabItem и использую его для нахождения правильной копии 'сложного управления'
  3. Обработчики объектов Regiter к 'комплексу управляют' событиями, чтобы сделать задание

Это неправильно потому что:

  • это - agains MVVM - я должен играть с управлением вкладкой, чтобы сделать задание вместо того, чтобы делать его в классе ViewModel
  • это связывает нежелательным способом представление и viewmodel
5
задан kubal5003 6 June 2010 в 10:11
поделиться

2 ответа

Мне кажется, что вы обременены пользовательским элементом управления WPF, который был создан кем-то, кто не намеревался использовать его с привязкой данных. Я предполагаю, что это происходит по одной из двух причин: а) есть какая-то логическая причина, по которой вы не должны иметь возможность выполнять привязку к этому свойству, или б) исходный автор этого элемента управления не знал, что он делал. Вы не предоставили мне достаточно информации, чтобы я знал, в каком из этих двух условий вы действительно работаете.

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

Если есть другие свойства, значения которых необходимо обновить при его изменении, правильный подход (или, по крайней мере, тот, который согласуется с дизайном свойств зависимостей) состоит в том, чтобы обрабатывать эти обновления в функции обратного вызова свойства зависимости, которая является для чего предназначена функция обратного вызова.

0
ответ дан 14 December 2019 в 13:27
поделиться

Я думаю, вы смешиваете свойства зависимостей и реализуете INotifyPropertyChanged в своих классах.

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

Допустим, у вас есть свойство Sum , к которому вы хотите выполнить привязку. Свойство Sum просто добавляет два других свойства (или поля, или что-то еще) вместе. Когда что-то происходит, что влияет на вычисление Sum , вы хотите уведомить, что значение Sum изменилось, поэтому все элементы управления, привязанные к Sum , будут обновлены.

public int Sum => Value1 + Value2;

public int Value1
{
    set
    {
        // changing  this affects "Sum", so I need to notify that the binding should update
        _value1 = value;
        OnPropertyChanged("Sum");
    }
}

public int Value2
{
    set
    {
        // changing this affects "Sum", so I need to notify that the binding should update
        _value2 = value;
        OnPropertyChanged("Sum");
    }
}
6
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: