Свойство пользовательской зависимости - привязка не работает - PullRequest
1 голос
/ 23 марта 2011

Я готовлю Custom UserControl, который будет находиться в DataGrid.DataContext для этого элемента управления будет идентификатор строки (из БД) и значение ComboBox, расположенное под DataGrid.

Вот как я встраиваю свой элемент управления в DataGrid:

<datagrid:DataGridTemplateColumn>
  <datagrid:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
       <nmspc:MyControl IdT="{Binding id}" BValue="{Binding SelectedValue, ElementName=MyComboBox}" />
    </DataTemplate>
  </datagrid:DataGridTemplateColumn.CellTemplate>
</datagrid:DataGridTemplateColumn>

Значения, которые я хочу связать, - это id и выбор MyComboBox.Вот как выглядит MyControl Code:

public static readonly DependencyProperty IdTProperty = DependencyProperty.Register("IdT", typeof(int), typeof(MyControl), new PropertyMetadata(IdTChanged));

private static void IdTChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  //BoxResult obj = d as MyControl;
  MessageBox.Show(e.NewValue.ToString());
  //obj.IdT = (int)e.NewValue;
}
public int IdT
{
  set {SetValue(IdTProperty, value); }
  get {return (int)GetValue(TEIdProperty); }
}

public static readonly DependencyProperty BValueProperty = DependencyProperty.Register("BValue", typeof(string), typeof(MyControl), new PropertyMetadata(IdTChanged));

private static void BValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  //BoxResult obj = d as MyControl;
  MessageBox.Show(e.NewValue.ToString());
  //obj.IdT = (string)e.NewValue;
}
public int BValue
{
  set {SetValue(BValueProperty, value); }
  get {return (int)GetValue(BValueProperty); }
}

Механизм привязки не работает с моим кодом.Я ожидаю, что будут вызваны обратные вызовы IdTChanged и BValueChanged, но они не будут.Написание этого кода я основал на этом .Заранее спасибо за все предложения.

С уважением, Pawel

Редактировать:

Вот так выглядит отладочный вывод:

System.Windows.Data Error: BindingExpression path error: 'id' property not found on 'My.MyControls.MyView.DataParams' 'My.MyControls.MyView.DataParams' (HashCode=42491497). BindingExpression: Path='id' DataItem='My.MyControls.MyView.DataParams' (HashCode=42491497); target element is 'My.MyControls.MyView.MyControl' (Name=''); target property is 'IdT' (type 'System.Int32')..
System.Windows.Data Error: BindingExpression path error: 'id' property not found on '852' 'System.Int32' (HashCode=852). BindingExpression: Path='id' DataItem='My.MyControls.MyView.DataParams' (HashCode=42491497); target element is 'My.MyControls.MyView.MyControl' (Name=''); target property is 'IdT' (type 'System.Int32')..

Я обнаружил, что это проблема с RelativeSource.Поэтому в привязке я установил это значение:

RelativeSource={RelativeSource TemplatedParent}

Проблема с BindingExpression исчезла, но все равно не работает (MessageBox в IdTChanged не отображается).

Некоторые предложения?

...