MVVM附加属性视图模型

时间:2016-06-16 11:39:04

标签: c# wpf xaml mvvm dependency-properties

我在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。

1 个答案:

答案 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();     
    }
}