2016-12-01 9 views
0

Я хочу просто показывать мой UserControl в отдельном окне, например, вызвавПоказать новое окно с DataContext

var windowHandler = new WindowHandler(); 
windowHandler.Show(new SchoolViewModel); 

Как архивировать это? Я попытался следующие:

Установите DataTemplate в App.xaml:

<Application.Resources> 
    <ResourceDictionary> 
     <DataTemplate DataType="{x:Type viewModel:SchoolViewModel}"> 
      <view:SchoolUserControl /> 
     </DataTemplate> 
    </ResourceDictionary> 
</Application.Resources> 

В коде-за его называют:

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    var windowHandler = new WindowHandler(); 
    windowHandler.ShowWindow(new SchoolViewModel(), 200, 200); 
} 

WindowHandler класс:

public class WindowHandler 
{ 
    public void ShowWindow(object dataContext, int height, int width) 
    { 
     Window window = new Window() 
     { 
      DataContext = dataContext, 
      Width = width, 
      Height = height 
     }; 
     window.Show(); 
    } 
} 

It показывает окно, но оно пустое. Почему он пуст? Я также установить DataContext в UserControl «s фоновым кодом:

public SchoolUserControl() 
{ 
    InitializeComponent(); 
    DataContext = this; 
} 
+1

Вы никогда не добавляете свой контроль в окно, вы просто помещаете его в словарь ресурсов. –

+1

Как правило, * никогда * явно не задает DataContext UserControl, независимо от того, что они говорят вам в блогах или онлайн-учебнике. – Clemens

+0

@BradleyUffner Что вы подразумеваете под этим? – HWWCAAx

ответ

0

Window по умолчанию шаблонного, чтобы показать Window.Content и не Window.DataContext. Таким образом, вы должны присвоить все, что вы хотите, чтобы показать, как содержание:

public class WindowHandler 
{ 
    public void ShowWindow(object dataContext, int height, int width) 
    { 
     Window window = new Window() 
     { 
      Content = dataContext, 
      Width = width, 
      Height = height 
     }; 
     window.Show(); 
    } 
} 

Кроме того, как другие отметили, вы должны удалить эту строку:

DataContext = this; 

от вашего SchoolUserControl, потому что в противном случае вы не будете иметь доступ к шаблонизированной модели представления изнутри элемента управления. А так как SchoolUserControl является частью DataTemplate, шаблонная модель будет автоматически доступна с SchoolUserControl.DataContext.

 Смежные вопросы

  • Нет связанных вопросов^_^