是否可以获取对象类型并将其动态设置为对象。我有几个ViewModel都包含相同的属性,并希望做这样的事情
if (this.DataContext is CamerasViewModel)
{
//Type type = Type.GetType((this.DataContext.ToString());
object o = Assembly.GetExecutingAssembly().CreateInstance(this.DataContext.GetType().ToString());
Type type = o.GetType();
foreach (ButtonViewModel button in (this.DataContext as type).Buttons)
{
if (button.DisplayName == this.Content.ToString())
{
this.Template = (ControlTemplate)this.FindResource(button.TemplateResource.Substring(0, button.TemplateResource.Length - 3) + "pr");
break;
}
}
}
而不是将this.DataContext称为CamerasViewModel,我想将this.DataContext称为THEDYNAMICTYPE
有什么建议吗?
答案 0 :(得分:3)
你可能会更好地利用你想要更新模板的Buttons
属性的所有类,并让它们实现一个接口。界面看起来像这样:
public interface IHasButtons
{
public IEnumerable<ButtonViewModel> Buttons {get; set;}
}
您的视图模型将声明如下:
public class CamerasViewModel : IHasButtons
{
public IEnumerable<ButtonViewModel> Buttons {get {. . .} set {. . .} }
. . .
}
然后,在if语句中,不检查对象是否是CamerasViewModel,而是检查它是否是IHasButtons。这样做比尝试在运行时确定对象上是否有Buttons属性要安全得多。你可能会感到不幸并且遇到一个Buttons属性,它具有相同的名称,但功能与您期望的不同。然后你回来编写疯狂的逻辑来确定这是否真的是你正在寻找的Buttons集合。如果你使用接口,它非常清楚。如果ViewModel实现了IHasButtons,那么它就是您要更新的ViewModel。如果它没有实现IHasButtons,你将跳过它