我有一个像这样的数据模板:
<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。这可能是问题吗?
答案 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。为什么?我不确定,但至少它现在有效。谢谢你的帮助。