0

是否可以获取对象的类型并将其动态设置为对象。我有几个 ViewModels 都包含相同的属性并想做这样的事情

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

有什么建议么?

4

1 回答 1

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,你会直接跳过它

于 2012-08-04T18:55:31.880 回答