Привязка данных к объекту DependencyObject на UserControl

#wpf #data-binding #user-controls #dependency-properties

#wpf #привязка данных #пользовательские элементы управления #зависимость-свойства

Вопрос:

У меня есть UserControl, который изложен следующим образом:

Сетка DeveloperExpress, привязанная к наблюдаемой коллекции, называемой Data:

  public ObservableCollection<SummaryData> Data { get; set; }
  

Метка с содержимым, привязанным к случаям, которая является первым элементом сбора данных:

 <Label FontStyle="Italic" Margin="2" Content="{Binding ElementName=CaseControlUC, Path=Cases.Exposed, TargetNullValue=IAmNull, Mode=OneWay}" />
  

где:

         public SummaryData Cases { get; set; }
    private void LoadExampleDataIntoSummaryGrid()
    {
        Cases = new SummaryData() { Caption = "Cases", Exposed = "A", Unexposed = "B" };
        Data.Add(Cases);
        Data.Add(new SummaryData() { Caption = "Controls", Exposed = "C", Unexposed = "D" });
    }
  

И код для SummaryData:

 public class SummaryData : DependencyObject
    {
        public string Caption { get; set; }


        public static readonly DependencyProperty ExposedProperty = DependencyProperty.Register("ExposedValue",
                                                                                                             typeof(string),
                                                                                                             typeof(SummaryData),
                                                                                                             new UIPropertyMetadata(null));

        public string Exposed
        {
            get
            {
                return (string)GetValue(ExposedProperty);
            }
            set
            {
                SetValue(ExposedProperty, value);
            }
        }



        public static readonly DependencyProperty UnexposedProperty = DependencyProperty.Register("UnexposedValue",
                                                                                                             typeof(string),
                                                                                                             typeof(SummaryData),
                                                                                                             new UIPropertyMetadata(null));


        public string Unexposed
        {
            get
            {
                return (string)GetValue(UnexposedProperty);
            }
            set
            {
                SetValue(UnexposedProperty, value);
            }
        }

        public string Total
        {
            get
            {
                int exposed;
                int unexposed;
                if (Int32.TryParse(Exposed, out exposed) amp;amp; Int32.TryParse(Unexposed, out unexposed))
                {
                    return (exposed   unexposed).ToString();
                }
                return String.Format("{0}   {1}", Exposed, Unexposed);
            }
        }
    }
  

Обратите внимание, что «Exposed» и «Неэкспонированный» являются свойствами DependencyProperties для DependencyObject.

Моя проблема в том, что, когда я использую Grid для обновления объекта Cases (и я знаю, что он действительно обновляется с помощью отладчика), изменение не отражается на метке. Я проверил, и окно вывода не показывает ошибок привязки данных. Кроме того, если я вернусь к использованию в качестве обычного свойства, начальное значение считывается просто отлично (хотя обновления не отражаются, ofc.)

Я также попытался вставить конвертер в привязку данных (просто NOP-конвертер, который возвращает все, что ему задано), и он действительно никогда не вызывался…

Есть какие-нибудь подсказки? 🙂

Ответ №1:

В вашем Exposed объявлении свойства зависимости вы неправильно указали имя свойства «ExposedValue», а не «Exposed».

Комментарии:

1. AFAIK строковый параметр — это просто произвольное текстовое имя свойства зависимости, и поэтому я могу называть его как угодно? Во всяком случае, я пытался изменить его, но, к сожалению, это не помогло.

2. У вас есть полный пример, доступный для загрузки, который воссоздает проблему? Обычно для типов моделей, таких как SummaryData, вы бы реализовали INotifyPropertyChanged, а не использовали свойства зависимостей, потому что это привязывает вас к WPF, и модель нельзя повторно использовать на других платформах.

3. Мне удалось заставить его работать час или около того назад — это был ПОЛНЫЙ мозговой штурм, и я смущен тем, что я опубликовал здесь для начала… Я создавал элемент, к которому я привязываю данные, после вызова InitializeComponent() в конструкторе моего UserControl, что означало, что я пытался привязать данные к null, и, конечно, когда я затем обновил значения после создания элемента, ну, привязка данных уже не удалась! Большое спасибо за вашу помощь, хотя!