2015-06-01 3 views
0

Я пытаюсь связать значение в customcontrol, размещенном внутри DataGridTemplateColumn, но привязка не работает.привязка DataContext к настраиваемому элементу управления

Мои DataGridTemplateColumn:

<DataGridTemplateColumn Width="auto" SortMemberPath="Etat" CanUserReorder="False" CanUserResize="True" x:Name="colonneEtat"> 
        <DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate /> 
        </DataGridTemplateColumn.CellEditingTemplate> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <widget:MyWidget MyObject="{Binding MyObjectVariable, Converter={StaticResource MyDebugConverter}}" Margin="5,0" VerticalAlignment="Center"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

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

public static readonly DependencyProperty MyObjectProperty= 
      DependencyProperty.Register("MyObject", 
      typeof(ObjectType), 
      typeof(MyWidget), 
      new PropertyMetadata(null)); 
public ObjectType MyObject 
     { 
      get { return (ObjectType)GetValue(MyObjectProperty); } 
      set { 
       SetValue(MyObjectProperty, value); 
       FillCustomControl(); 
      } 
     } 

Debug конвертер является просто манекен конвертер для тестирования связывания :

public object Convert(object value, Type targetType, 
       object parameter, CultureInfo culture) 
     { 
      System.Diagnostics.Debugger.Break(); 
      return value; 
     } 

Мои пользовательские элементы управления отлично работают, я уже пробовал это в ano Это место моего заявления. Его функционирование прост: когда свойство установлено I Заполните настраиваемый элемент управления в зависимости от содержимого из свойства. Как сказано, это поведение было протестировано.

Но в случае этой DataGridTemplateColumn свойство никогда не устанавливается. У меня нет никакой ошибки привязки на выходе, и отладчик останавливается в конвертере + значение в конвертере - это ожидаемое значение. Но по какой-то причине он не устанавливает значение свойства внутри моего настраиваемого элемента управления.

Что мне не хватает?

Спасибо

+1

Я запутался. Свойство 'MyObject' определено в' MyWidget', но ваше использование 'MyWidget' использует свойство' ObjectProperty' и пытается привязать его к 'MyObject'. Что такое 'ObjectProperty'? Где находится этот столбец? –

+0

Действительно два объекта с тем же именем ... Я изменил, но все еще не работал. – user2088807

+0

Я не подразумевал, что именно поэтому это не сработало, было непонятно, что вы пытались сделать.Мы все еще не знаем, где «MyObjectVariable», что вы можете делать с «DataContext» в «MyWidget» внутри и т. Д. Было бы полезно, если бы вы могли предоставить [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve), чтобы кто-то мог воспроизвести вашу проблему. Ответы будут в лучшем случае догадки. –

ответ

0

Вы должны опустить Property часть из DependencyProperty при связывании данных к нему, так что вместо этого:

<widget:MyWidget ObjectProperty="{Binding MyObject ... }" /> 

Вы должны использовать это:

<widget:MyWidget MyObject="{Binding MyObject ...}" /> 

Если только у вас есть еще DependencyProperty с именем ObjectPropertyProperty, определенным в вашем классе Widget. Кроме того, согласно вашему коду, объект, который установлен как DataContext для DataGrid, должен иметь свойство с именем MyObject.


UPDATE >>>

Хорошо, теперь я понимаю вашу проблему. То есть, установщик свойства CLR, относящийся к DependencyProperty, является никогда, вызываемый Framework ... это свойство CLR для только для вашего использования. Если вы хотите что-то сделать, когда изменилось значение DependencyProperty, вам необходимо настроить PropertyChangedCallback handler. Вы можете сделать это, как это (от связанной страницы на MSDN):

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
    "AquariumGraphic", 
    typeof(Uri), 
    typeof(AquariumObject), 
    new FrameworkPropertyMetadata(null, 
     FrameworkPropertyMetadataOptions.AffectsRender, 
     new PropertyChangedCallback(OnUriChanged) 
) 
); 

private static void OnUriChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    Shape sh = (Shape) d; 
    sh.Fill = new ImageBrush(new BitmapImage((Uri)e.NewValue)); 
} 

В самом деле, вы даже можете игнорировать PropertyChangedCallback конструктор и объявить его как это тоже:

public static readonly DependencyProperty AquariumGraphicProperty = 
    DependencyProperty.Register("AquariumGraphic", typeof(Uri), typeof(AquariumObject), 
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, 
    OnUriChanged)); 
+0

Действительно, спасибо, ошибка при вставке кода ... Исправлено. Свойство имеет правильное имя, а MyObject содержит значение (как я могу проверить в Debug Converter). Но «набор» никогда не называется. Я попытался поставить «объект», но такую ​​же проблему. – user2088807

+0

См. Мое обновление ответа. – Sheridan

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