我在MVVM中遇到了附加属性这个问题。我正在构建一个C#WPF应用程序。
我使用ClassObject类型的自定义类填充ObserverableCollection。从这个集合我在画布上创建ClassShapeViews。这些ClassShapeViews需要对ClassObject的引用才能显示正确的信息。
要传递ClassObject引用,我将绑定到XAML中的AttachedProperty,如下所示:
<ItemsControl ItemsSource="{Binding ClassObjectList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="canvas" Background="White" AllowDrop="True"
DragEnter="canvas_DragEnter"
DragOver="canvas_DragOver"
Drop="canvas_Drop"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<!-- This part doesn't work-->
<shape:ClassShapeView>
<Style TargetType="shape:ClassShapeView">
<Setter Property="shape:ClassShapeView.ClassObject" Value="{Binding}"/>
</Style>
</shape:ClassShapeView>
<Label Content="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
在ClassShapeView背后的代码中,我正在处理DependencyProperty:
public partial class ClassShapeView : UserControl
{
protected ClassShapeViewModel viewModel { get { return DataContext as ClassShapeViewModel; } }
public ClassShapeView()
{
InitializeComponent();
this.DataContext = new ClassShapeViewModel();
}
public static readonly DependencyProperty ClassObjectProperty =
DependencyProperty.RegisterAttached("ClassObject", typeof(ClassObject), typeof(ClassShapeView), new PropertyMetadata(default(ClassObject)));
public static void SetClassObject(UIElement element, ClassObject value)
{
element.SetValue(ClassObjectProperty, value);
}
public static ClassObject GetClassObject(UIElement element)
{
return (ClassObject)element.GetValue(ClassObjectProperty);
}
public ClassObject MyClassObject
{
get { return viewModel.ClassObject; }
set { viewModel.ClassObject = value; }
}
}
收到ClassObject引用后,我想将此引用发送到带有MyClassObject属性的附加ViewModel。 ClassShapeView中的数据绑定到ViewModel。
我无法弄清楚如何将CodeBehind的ClassObject Reference转换为ViewModel。
答案 0 :(得分:0)
感谢Clemens我有答案
“当ItemsControl的ItemsSource属性绑定到ClassObject实例的集合(我认为是你的ClassObjectList)时,每个项容器的DataContext(例如ContentPresenter)被设置为集合中的相应元素。 DataContext继承到ItemTemplate中,因此DataTemplate中的控件(例如你的UserControl)已经获得了正确的ClassObject元素作为它们的DataContext。“
所以我的XAML现在看起来像这样
<ItemsControl ItemsSource="{Binding ClassObjectList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="canvas" Background="White" AllowDrop="True"
DragEnter="canvas_DragEnter"
DragOver="canvas_DragOver"
Drop="canvas_Drop"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<shape:ClassShapeView/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我的视图看起来像这样:
public partial class ClassShapeView : UserControl
{
public ClassShapeView()
{
InitializeComponent();
}
}