2013-10-09 4 views
1

У меня есть список пользовательских элементов управления. Я хочу показывать только по одному на мой взгляд. Для этого я использую ComboBox для отображения списка пользовательских элементов управления. И отобразите их в зависимости от выбранного элемента ComboBox. Я создал пользовательский интерфейс ICustomInterface, который имеет свойство Title, которое я хочу отобразить пользователю. И я реализовал это на своих пользовательских интерфейсах.Combox, показывающий пользовательский контроль вместо текста MVVM

Но проблема в том, что когда я запускаю свое приложение, вместо того, чтобы видеть текст заголовка, я вижу сам UserControl.

enter image description here

Здесь можно увидеть, что весь пользовательский элемент управления присутствует в выпадающем списке. Что мне нужно для отображения текста.

Адрес XAML код.

<ComboBox Grid.Column="1" ItemsSource="{Binding Modules}" SelectedItem="{Binding SelectedModule}" DisplayMemberPath="{Binding Title}"/> 

вот модель.

public List<ICustomInterface> Modules 
{ 
    get 
    { 
     return _modules; // Assume that there are some items present in this. 
    } 
} 

И вот мой пользовательский контроль, чью коллекцию я пытаюсь отобразить.

public partial class LauncherView : UserControl, ICustomInterface 
{ 
    public string Title { get { return "Launcher"; } } 

    // User control stuff. 
} 
+0

Название должно быть частью класса, тип которого является вашим модулем, тогда можно увидеть только заголовок – Vishal

ответ

1

Чтобы ответить на ваш вопрос, кажется, что нет никакой связи между LauncherView класса и вашей ICustomInterface коллекции. @Farzi правильно прокомментировал, что ваше свойство Title должно быть объявлено в интерфейсе ICustomInterface, если вы хотите иметь к нему доступ из объекта ICustomInterface.

Чтобы устранить эту проблему, либо добавить Title свойства в интерфейс ICustomInterface или изменить тип вашей Modules коллекции какой типа реализует Title свойства.

Личные мысли о вашей установке:

Лично я считаю, что, имея коллекцию UserControl объектов в ComboBox.ItemsSource не является хорошей идеей. Вы будете потреблять все ресурсы, необходимые для всех из них, хотя отображается только один.

Вместо этого вы можете использовать коллекцию string s, которые представляют заголовки каждого UserControl, а затем привязаны к объекту ComboBox.SelectedItem. Тогда у вас может быть только одно свойство типа ICustomInterface, которое вы можете обновить из свойства SelectedItem, когда оно изменится.

В WPF мы обычно работаем с данными, а не с элементами управления пользовательского интерфейса.Таким образом, даже лучший вариант был бы манипулировать модели зрения каждого вида, а и отобразить модель представления в ContentControl, водрузив некоторые DataTemplates первыми:

<Application.Resources> 
    <DataTemplate DataType="{x:Type ViewModels:YourViewModel}"> 
     <Views:YourView /> 
    </DataTemplate> 
</Application.Resources> 

В главном окне:

<ContentControl Content="{Binding ViewModel}" /> 

В основной модели представления или код позади:

public ICustomInterface ViewModel 
{ 
    get { return viewModel; } 
    set { viewModel= value; NotifyPropertyChanged("ViewModel"); } 
} 

public string SelectedTitle 
{ 
    get { return selectedTitle; } 
    set 
    { 
     selectedTitle = value; 
     NotifyPropertyChanged("SelectedTitle"); 
     if (SelectedTitle == "Something") ViewModel = new SomethingViewModel(); 
     if (SelectedTitle == "Other") ViewModel = new OtherViewModel(); 
    } 
} 

или вы могли есть коллекция режим просмотра Ls (гипотрофии ресурсы):

public string SelectedTitle 
{ 
    get { return selectedTitle; } 
    set 
    { 
     selectedTitle = value; 
     NotifyPropertyChanged("SelectedTitle"); 
     ViewModel = ViewModelCollection.Where(v => v.Title == SelectedTitle); 
    } 
} 

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

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