Combox显示用户控件而不是文本MVVM

时间:2013-10-09 09:41:55

标签: c# wpf mvvm combobox

我有一个用户控件列表。我想在我的视图中一次只显示一个。为了实现这一点,我使用ComboBox来显示用户控件列表。并根据所选的ComboBox项显示它们。我创建了一个自定义界面ICustomInterface,它具有我想要显示给用户的Title属性。我在用户界面上实现了这一点。

但问题是,当我运行我的应用程序时,我没有看到标题文本,而是看到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.
}

1 个答案:

答案 0 :(得分:1)

要回答您的问题,您的LauncherView课程与ICustomInterface集合之间似乎没有关联。 @Farzi正确评论说,如果您希望能够从Title对象访问ICustomInterface接口,则应在ICustomInterface接口中声明该属性。

要解决此问题,请将Title属性添加到ICustomInterface界面,或将Modules集合的类型更改为实现Title属性的任何类型。

  

关于您的设置的个人想法:

就我个人而言,我认为在UserControl中收集ComboBox.ItemsSource个对象并不是一个好主意。您将消耗所有所需的所有资源,即使只显示了一个

您可以使用代表每个string标题的UserControl集合,然后绑定到ComboBox.SelectedItem属性,而不是这样做。然后,您可以只拥有一个ICustomInterface类型的属性,您可以在SelectedItem属性发生更改时进行更新。

在WPF中,我们通常使用数据而不是UI控件。因此,更好的选择是操纵每个视图的视图模型,并在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();
    }
}

或者你可以拥有一组视图模型(浪费资源):

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

我明白你没有要求我的任何个人想法,我希望他们以某种方式帮助过你。如果他们不受欢迎,请道歉。