Почему эта привязка не работает должным образом, даже если она получает значение из источника?
У меня есть свой собственный класс:
public class PeriodContainerPanel:StackPanel
{
public PeriodContainerPanel()
: base()
{
addCollectionsToStackPanel();
}
private void addCollectionsToStackPanel()
{
this.Children.Clear();
if (PeriodsList!=null)
{
double minutes = PeriodsList.Count * (Properties.Settings.Default.EndTimeSpan - Properties.Settings.Default.StartTimeSpan).TotalMinutes;
foreach (ObservableCollection<PeriodBase> lst in PeriodsList)
{
this.Children.Add(new ChartUserControl(lst) { Minutes = minutes });
}
}
}
public List<ObservableCollection<PeriodBase>> PeriodsList
{
get { return (List<ObservableCollection<PeriodBase>>)GetValue(PeriodsListProperty); } //do NOT modify anything in here
set { SetValue(PeriodsListProperty, value); addCollectionsToStackPanel(); } //...or here
}
public static readonly DependencyProperty PeriodsListProperty =
DependencyProperty.Register(
"PeriodsList", //Must be the same name as the property created above
typeof(List<ObservableCollection<PeriodBase>>), //Must be the same type as the property created above
typeof(PeriodContainerPanel), //Must be the same as the owner class
new UIPropertyMetadata(
null //default value, must be of the same type as the property
));
}
И я использую это DependencyProperty
PeriodList
в UserControl
как это:
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<UI:PeriodContainerPanel PeriodsList="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=DataContext}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
Я проверяю с Convertor
есть ли процесс получения (если есть значение) да, есть значение, и это правильно, но не установлено PeriodsList
имущество. Что проблема? PS если есть какие-либо вопросы по поводу кода, пожалуйста, скажите, я могу добавить
2 ответа
addCollectionsToStackPanel()
не будет вызываться, когда происходит связывание. Механизм привязки использует SetValue
напрямую, и поэтому вы никогда не должны делать подобную логику в свойстве. (Вот почему в автоматически сгенерированном комментарии написано "НЕ модифицируйте ничего")
Использовать PropertyChangedCallback
для этого сценария: http://msdn.microsoft.com/en-us/library/ms745795.aspx
Как и предложил @MrDosu, используйте PropertyChangedCallback для свойства DependencyProperty. Проблема с тем, что Callback является статическим, не такая уж большая проблема, так как вы получите ссылку на DependencyObject в вызове:
private static void ValueChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyCustomControl)d).RaiseMyValueChanged(); //Where RaiseMyValueChanged is a private non-static method.
}
Кроме того, использование TemplatedParent и Path=DataContext кажется странным. Путь должен указывать на свойство. TemplatedParent используется при определении стилей и / или шаблонов элементов управления, ваш фрагмент XAML не является шаблоном элемента управления в ресурсе, верно?