Как получить доступ к свойствам определенного объекта? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующий код. (Предназначен для открытия модели представления из кода).

private void OpenView<viewType,viewModelType> (object parameters) {

        //STEP 1. CREATE THE VIEW
        var view = (viewType)Activator.CreateInstance(typeof(viewType));            

        //STEP 2. SET THE DATACONTEXT
        var viewModel = (viewModelType)view.DataContext;            

        //STEP 3. OPEN THE WINDOW AND WAIT UNTIL MANUALLY CLOSED            
        TestWindow window = new TestWindow();
        window.LayoutRoot.Children.Add(view);
        window.Activate();
        window.ShowDialog();            
    }

Компилятор выдает мне следующую ошибку:

Ошибка CS1061 «viewType» не содержит определения для «DataContext» и без метода расширения «DataContext», принимающий первый может быть найден аргумент типа 'viewType' (вы не используете директива или ссылка на сборку?)

Я не могу получить доступ к DataContext на шаге 2, потому что я предполагаю, что компилятор не знает, какой тип является переменной представления. Может кто-нибудь сказать мне, как я могу сказать компилятору, какой тип переменной представления? и если это невозможно. Как обойти это?

1 Ответ

0 голосов
/ 27 июня 2018

Здесь есть два реальных решения.

  1. viewType всегда одного типа: так что не делайте это универсальным.
  2. viewType всегда наследуется от одного базового класса или реализует общий интерфейс. Например, это всегда FrameworkElement, обладающее свойством DataContext. Если это так, вы можете ограничить универсальный тип этим классом:

    private void OpenView<TViewType, TViewModelType>(object parameters)
        where viewType : FrameworkElement // This is the magic sauce
    {
        var view = (TViewType)Activator.CreateInstance(typeof(TViewType));            
    
        // Now we can access the DataContext
        var viewModel = (TViewModelType)view.DataContext;  
    
        //snip
    }
    

PS Довольно распространенной практикой является добавление префиксных типов к T

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...