从View-Model绑定到Silverlight中的子用户控件的View-Model? 2个来源 - 1个目标

时间:2010-03-18 03:41:02

标签: silverlight data-binding user-controls mvvm dependency-properties

所以我有一个UserControl用于我的一个视图,并在其中有另一个'子'UserControl。

外部'父'UserControl在其View-Model上有一个Collection,在其上有一个Grid控件,用于显示Items列表。

我想在此UserControl中放置另一个UserControl,以显示表示一个Item的详细信息的表单。

父UserControl的View-Model已经有一个属性来保存当前选中的Item,我想将它绑定到子UserControl上的DependancyProperty。然后我想将DependancyProperty绑定到子UserControl的View-Model上的属性。

然后,我可以在XAML中使用绑定表达式设置DependancyProperty一次,并让子UserControl在其View-Model中完成所有工作。

我的代码看起来像这样..

父UserControl:

<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>

编辑:以下是我如何为孩子UC创建Dependancy Proeprty:

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 :(得分:0)

好吧,看起来你试图在父UserControl上使用“普通”DependencyProperty,在子UserControl上使用“附加”DependencyProperty。你需要选择一种方式。 :)

编辑澄清: 注册依赖项属性有两种方法,“正常”,如下所示:

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可以是包含ItemDetailsView的DataTemplate,在这种情况下你可以使用标准数据绑定来做什么你需要:

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