C# MVVM附加属性视图模型
MVVM中的附加属性存在此问题。我正在构建一个C#WPF应用程序 我正在用ClassObject类型的自定义类填充ObserverableCollection。从这个集合中,我在画布上创建ClassShapeView。这些ClassShapeView需要对ClassObject的引用来显示正确的信息 要传递ClassObject引用,我将绑定到XAML中的AttachedProperty,如下所示:C# MVVM附加属性视图模型,c#,wpf,xaml,mvvm,dependency-properties,C#,Wpf,Xaml,Mvvm,Dependency Properties,MVVM中的附加属性存在此问题。我正在构建一个C#WPF应用程序 我正在用ClassObject类型的自定义类填充ObserverableCollection。从这个集合中,我在画布上创建ClassShapeView。这些ClassShapeView需要对ClassObject的引用来显示正确的信息 要传递ClassObject引用,我将绑定到XAML中的AttachedProperty,如下所示: <ItemsControl ItemsSource="{Binding ClassObje
<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>
public partial class ClassShapeView : UserControl
{
public ClassShapeView()
{
InitializeComponent();
}
}
在收到ClassObject引用后,我想将该引用发送到带有属性MyClassObject的附加ViewModel。ClassShapeView中的数据绑定到ViewModel
我只是不知道如何将类对象引用从CodeBehind转换为ViewModel。多亏了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>
项容器(及其所有子项)的DataContext已自动设置为相应的数据项对象。因此,将
ClassObject
设置为{Binding}
似乎是完全多余的。只需删除this.DataContext=newclassshapeviewmodel()从ClassShapeView的构造函数中选择code>,以允许继承DataContext,并允许UserControl在继承的DataContext中直接操作ClassObject实例。这是一种非常不寻常的方法。通常,视图模型之间的关系和连接由视图模型本身设置。这种观点仅仅反映了它在那里的发现。为什么不将ClassObject的属性绑定到ShapeView的属性?无论如何,在DataTemplate中,{Binding}
是DataContext——类对象。您需要{Binding RelativeSource={RelativeSource Self}
。我会直接在ShapeView上尝试,而不是在样式设置器中。换句话说,用户控件不需要使用自己的视图模型。特别是,当它用于应该在继承的DataContext上操作的场景时,它永远不应该创建自己的视图模型实例。另请参见。@Clemens,你是说usercontrol不能有自己的ViewModel?那么新问题是?我是否使用viewmodel,以及如何设置对象引用以便它可以绑定到usercontrol中?
public partial class ClassShapeView : UserControl
{
public ClassShapeView()
{
InitializeComponent();
}
}