Привязка из View-Model к View-Model дочернего пользовательского элемента управления в Silverlight? 2 источника - 1 цель - PullRequest
1 голос
/ 18 марта 2010

Итак, у меня есть UserControl для одного из моих просмотров, и внутри него есть еще один дочерний UserControl.

Внешний 'родительский' UserControl имеет коллекцию в своей View-Model и элемент управления Grid для отображения списка Items.

Я хочу разместить другой UserControl внутри этого UserControl, чтобы отобразить форму, представляющую детали одного Item.

В родительской модели представления UserControl уже есть свойство для хранения текущего выбранного Item, и я хотел бы привязать его к свойству DependancyProperty дочернего элемента UserControl. Затем я хотел бы связать этот DependancyProperty со свойством в View-Model дочернего UserControl.

Затем я могу установить свойство DependancyProperty один раз в XAML с выражением привязки и заставить дочерний UserControl выполнять всю свою работу в своей View-Model так, как следует.

Код, который у меня есть, выглядит следующим образом ..

Родительский контроль пользователя:

<UserControl x:Class="ItemsListView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding Source={StaticResource ServiceLocator}, Path=ItemsListViewModel}">
    <!-- Grid Control here... -->
    <ItemDetailsView Item="{Binding Source={StaticResource ServiceLocator}, Path=ItemsListViewModel.SelectedItem}" />
</UserControl>

Child UserControl:

<UserControl x:Class="ItemDetailsView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding Source={StaticResource ServiceLocator}, Path=ItemDetailsViewModel}"
    ItemDetailsView.Item="{Binding Source={StaticResource ServiceLocator}, Path=ItemDetailsViewModel.Item, Mode=TwoWay}"> 
    <!-- Form controls here... -->
</UserControl>

РЕДАКТИРОВАТЬ: Вот как я создал Propenprice Propendrty для ребенка UC:

public partial class ItemDetailsView : UserControl
{
    private static readonly DependencyProperty itemProperty;

    static ItemDetailsView()
    {
        ItemDetailsView.itemProperty = DependencyProperty
            .Register("Item", typeof(Item), typeof(ItemDetailsView), null);
    }

    public Item Item
    {
        get { return (Item)GetValue(ItemDetailsView.itemProperty); }
        set { SetValue(ItemDetailsView.itemProperty, value); }
    }

    public static Item GetItem(DependencyObject target)
    {
        return (Item)target.GetValue(itemProperty);
    }

    public static void SetItem(DependencyObject target, Item value)
    {
        target.SetValue(itemProperty, value);
    }
}

Выбранный Item привязан к штрафу DependancyProperty. Однако из свойства DependancyProperty для дочернего View-Model нет.

Похоже, что существует ситуация, когда есть две параллельные привязки, которые должны работать, но с одной и той же целью для двух источников.

Почему не работает вторая (в дочернем UserControl) привязка ?? Есть ли способ добиться поведения, которое я преследую ??

Приветствие.

1 Ответ

0 голосов
/ 18 марта 2010

Похоже, вы пытаетесь использовать «нормальный» DependencyProperty в родительском UserControl и «прикрепленный» DependencyProperty в дочернем UserControl. Вам нужно выбрать один путь. :)

РЕДАКТИРОВАТЬ для уточнения: Существует два способа регистрации свойства зависимости "Normal", например:

public static readonly DependencyProperty BobProperty = 
    DependencyProperty.Register("Bob",....)

и Прилагается:

public static readonly DependencyProperty BobAttachedProperty = 
    DependencyProperty.RegisterAttached("BobAttached",...)

Допустим, элемент управления, на котором вы регистрируете эти свойства, называется «MyPanel». Чтобы использовать каждое свойство:

<MyPanel Bob="somevalue" MyPanel.BobAttached="somevalue"/>

Обратите внимание на необходимость указать "где определено присоединенное свойство". Присоединенные свойства хороши, когда у вас есть немного поведения или функциональности, которые применяются к нескольким типам элементов управления.

Тем не менее, возможно, есть лучший способ сделать это - если родительский UserControl содержит ItemsControl, ItemTemplate для этого элемента управления может быть DataTemplate, который содержит ItemDetailsView, и в этом случае вы можете использовать стандартную привязку данных вам нужно было:

<UserControl blahblahblah>
    <ItemsControl ItemsSource="{Binding WhereYourItemsAre}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
               <ns:WhatYourChildViewIsCalled DataContext="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</UserControl>
...