从DataTemplate的数据类中引用DataTemplate中的Usercontrol

时间:2012-06-26 01:39:38

标签: wpf user-controls datatemplate

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

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

UCComponent是一个带有名为ID的公共属性的用户控件。 ComponentViewModel还有一个名为ID的属性。我想在ViewModel的属性的setter中设置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。这可能是问题吗?

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

谢谢吉姆, 我让它以这种方式工作:在我的UserControl中:

    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。为什么?我不确定,但至少它现在有效。谢谢你的帮助。