2011-10-19 4 views
1

У меня есть UserControl, который выкладывается как следующее:Databinding к DependencyObject на UserControl

Сетка DeveloperExpress привязан к ObservableCollection под названием 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) && Int32.TryParse(Unexposed, out unexposed)) 
       { 
        return (exposed + unexposed).ToString(); 
       } 
       return String.Format("{0} + {1}", Exposed, Unexposed); 
      } 
     } 
    } 

Обратите внимание, что "Exposed" и "Неэкспонированную" оба DependencyProperties на DependencyObject.

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

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

Какие-нибудь подсказки там? :)

ответ

1

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

+0

AFAIK параметр string - это просто текстовое имя свойства зависимостей, и поэтому я могу называть его любым, что я хочу? В любом случае, я попытался изменить его, но, к сожалению, это не помогло. – Fafnr

+0

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

+0

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

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