1

我有一个这样的数据模板:

<DataTemplate DataType="{x:Type mvvm:ComponentViewModel}">
   <v:UCComponents></v:UCComponents>
</DataTemplate> 

UCComponent 是一个用户控件,具有一个名为 ID 的公共属性。ComponentViewModel 还有一个名为 ID 的属性。我想在 ViewModel 属性的设置器中设置 UCComponent ID 属性。我怎样才能做到这一点?

这是我尝试过的:

private string _ID;
public string ID 
{
    set { ((UCComponents)((DataTemplate)this).LoadContent()).ID = value; } 
}

错误:这不能​​从 ComponentViewModel 转换为 DataTemplate。任何帮助将不胜感激。

我不忠于 MVVM 设计模式,这可能是我感到沮丧的原因,但是有没有办法访问模板中使用的 UserControl?

阿曼达


感谢您的帮助,但它不起作用。ID 的 getter 和 setter 永远不会被调用。这是我的代码:

public static DependencyProperty IDProperty = DependencyProperty.Register("ID",     typeof(Guid), typeof(UCComponents));
public Guid ID
{
    get
    { return (Guid)GetValue(IDProperty); }
    set
    { 
        SetValue(IDProperty, value);
        LoadData();
    }
}

我不能使 UserControl 成为 DependencyObject。这也许是问题所在?

4

2 回答 2

0

您可以在用户控件 (UCComponents.xaml.cs) 上添加依赖属性,如下所示

    public static DependencyProperty IDProperty = DependencyProperty.Register(
    "ID",
    typeof(Object),
    typeof(BindingTestCtrl));

    public string ID
    {
        get
        {
            return (string)GetValue(IDProperty);
        }
        set
        {
            SetValue(IDProperty, value);
        }
    }

然后你可以使用绑定它

<DataTemplate DataType="{x:Type mvvm:ComponentViewModel}">
    <v:UCComponents ID="{Binding ID}" />
</DataTemplate>

另一种解决方案是处理用户控件上的 DataContextChanged 事件,例如

    private ComponentViewModel _data;

    private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        _data = e.NewValue as ComponentViewModel;
        this.ID = _data.ID;
    }
于 2012-06-26T03:35:00.257 回答
0

谢谢吉姆,我让它以这种方式工作:在我的用户控件中:

    public static DependencyProperty IDProperty = DependencyProperty.Register("ID", typeof(Guid), typeof(UCComponents));
    public Guid ID
    {
        get
        { return (Guid)GetValue(IDProperty); }
        set
        {
            SetValue(IDProperty, value);
            LoadData();
        }
    }

    private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        _data = e.NewValue as ComponentViewModel;
        this.ID = _data.ID;
    }

在我的 ViewModel(用作模板类型)中:

    public ComponentViewModel(Guid id)
    {
        DisplayName = "Component";
        Glyph = new BitmapImage(new Uri("/Remlife;component/Images/Toolbox/Control.png", UriKind.Relative));
        ID = id;
    }

在我的资源文件中:

<DataTemplate DataType="{x:Type mvvm:ComponentViewModel}">
    <v:UCComponents ID="{Binding ID}"/>
</DataTemplate>   

不知何故,我仍然需要在它的构造函数中将 ID 传递给 ViewModel。为什么?我不确定,但至少它现在有效。谢谢你的帮助。

于 2012-06-28T11:43:20.377 回答