C# MVVM附加属性视图模型

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

MVVM中的附加属性存在此问题。我正在构建一个C#WPF应用程序

我正在用ClassObject类型的自定义类填充ObserverableCollection。从这个集合中,我在画布上创建ClassShapeView。这些ClassShapeView需要对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>
    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(),以允许继承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();     
    }
}