Как связать пользовательский элемент управления UserControl с текущим элементом внутри ItemTemplate? - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть ListBox, который связан с данными ObservableCollection.
Внутри DataTemplate у меня есть пользовательский элемент управления, который я хочу привязать к текущему элементу. Как я могу это сделать? Каким должен быть путь привязки?

Model

private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items
{
  get { return _items; }
  set
  {
    if (_items.Equals(value))
      return;
    _items = value;
    RaisePropertyChanged("Items");
  }
}

XAML:

<ListBox ItemsSource="{Binding Items}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <TextBlock TextWrapping="Wrap" Text="{Binding Id}" Margin="2"/>
        <TextBlock TextWrapping="Wrap" Text="{Binding Name}" Margin="2"/>
        <uc:MyControl MyValue="{Binding <WHATSHOULDTHISBE>, Mode=TwoWay}" Margin="2"/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>

User control

public partial class MyControl : UserControl
{
  public MyItem MyValue
  {
    get { return (MyItem)GetValue(MyProperty); }
    set { SetValue(MyProperty, value); }
  }

  public static readonly DependencyProperty MyProperty = DependencyProperty.Register("MyValue",
                                                        typeof(MyItem), typeof(MyControl),
                                                        new PropertyMetadata(
                                                          new PropertyChangedCallback(PropertyChanged)));
  public MyControl()
  {
    InitializeComponent();
  }

  private static void PropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
  {
    MyControl c = obj as MyControl;
    if (c != null)
    {
      // TODO: do something here 
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Ваш MyItem является контекстом данных - если вы хотите привязать к какому-либо элементу My Item, то это:

Binding Path=my_item_member 

Чтобы связать MyItem полностью, я думаю, вы хотите:

Binding Path=.

Вам может также понадобиться DataTemplate для вашего элемента управления (в дополнение к тому, что у вас есть для ListBoxItems), который отображает элементы MyItems в ваши поля элемента управления.

0 голосов
/ 04 октября 2011

Свойство MyControl.DataContext в этом случае уже будет привязано к вашей модели представления элемента.

...