2013-08-20 4 views
0

Итак, я создал свой собственный подкласс UserControl, называемый ChildView (я действительно не могу придумать достойное имя), который я хочу показать внутри контейнера в окне, у меня много различные типы этих UserControls и окно должны быть способны показать все из них. В элементы управления UserControl реализовали свой подкласс, как это:привязка данных к пользовательскому UserControl

<src:ChildView x:Class="(namespace).LoginView" [...]> 
public partial class LoginView : ChildView 

И я пытался добавить его в мое окно, как так:

<Grid x:Name="ViewHolder" Grid.Column="1" Grid.Row="1"> 
     <src:ChildView DataContext="{Binding CurrentView}" /> 
</Grid> 
private ChildView _currentView; 
public ChildView CurrentView 
{ 
    get { return _currentView; } 
    set 
    { 
     if (_currentView == value) 
      return; 

     _currentView = value; 
     smLog.Trace("View set to {0}", value.GetType().Name); 
     NotifyPropertyChanged("CurrentView"); 
    } 
} 

Однако это не гк. Когда я устанавливаю CurrentView, ничего не отображается в моем контейнере. На выходе нет сообщений об ошибках, которые указывают на проблему с привязкой. Другие привязки данных в окне работают. Я могу использовать мой ChildViews, указав свои классы непосредственно в XAML, то есть:

<Grid x:Name="ViewHolder" Grid.Column="1" Grid.Row="1"> 
     <src:LoginView /> 
</Grid> 

Я прочитал некоторые о свойствах зависимостей, но я не думаю, что я нужен здесь? Я попытался реализовать его так или иначе, но он, похоже, не помог, хотя я, вероятно, ошибся, я не мог обволакивать его ...

Так что, я думаю, мой вопрос: мне нужно свойство зависимости? Если да, то как это реализовать в этом случае? Если нет, в чем проблема?

+0

элемента управления попробовать 'snoop'. это утилита wpf и очень полезно проверить, существует ли ваш контроль в сетке и какие именно проблемы у вас здесь. – Eugene

+0

Согласно Snoop мой ViewHolder содержит «ChildView 2» [007], и если я проверю его свойства, то DataContext выделяется зеленым цветом и говорит "[(namespace) .LoginView] {Path = CurrentView}". IsInitialized, IsLoaded, IsVisible, IsEnabled - все верно ... Высота и ширина имеют разумные значения. – moggizx

ответ

1

Изменение значения DataContext для ребенка не имеет значения, вы пытаетесь изменить сам элемент управления, а не данные, к которым он привязан. Что вам нужно сделать, это добавить элемент управления замещающим элементом, который будет содержать фактическое представление. У WPF есть такая штука, взгляните на ContentControl.

Изменить вашу сетку так, это будет containt в ContentControl вместо ChildView и привязать вид к содержанию имущества

<Grid> 
    <ContentControl Content="{Binding CurrentView}"/> 
</Grid> 
+1

Ах, ты прав. Он работает сейчас, спасибо! – moggizx

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