0

オブジェクトのタイプを取得し、動的にオブジェクトとして設定することは可能ですか。すべて同じプロパティを含むいくつかの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 と言いたい

助言がありますか?

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 に答える