所以我有一个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中)绑定工作?有没有办法实现我追求的行为?
干杯。
答案 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>