WPF 组合框和数据绑定到其他类

Posted

技术标签:

【中文标题】WPF 组合框和数据绑定到其他类【英文标题】:WPF Combo Box and Data Binding to other classes 【发布时间】:2012-06-04 20:26:03 【问题描述】:

所有,

我真的被一个非常基本的概念困住了——我只是找不到我真正理解的答案。

我有一个视图 - viewContacts。它的数据上下文是一个视图模型 - viewmodelContacts。

在视图中,我有一个“头衔”组合框(你知道......先生、夫人、小姐等)。我想绑定 itemssource 以便它显示选项列表,并绑定 SelectedValue 以便它将键存储在 viewmodelContacts TitleId 属性中。

如果标题(我想将 ItemsSource 绑定到)实际上位于单独的静态类中,则“源”列表 - 注意不是视图模型!

internal static class Titles

    static IList<Title> _colTitles = null;
    static Titles()
    
        _colTitles = new List<Title>();
        _colTitles.Add(new Title()  TitleId = 1, Description = "Mr." );
        _colTitles.Add(new Title()  TitleId = 2, Description = "Mrs." );
        _colTitles.Add(new Title()  TitleId = 3, Description = "Miss." );
        _colTitles.Add(new Title()  TitleId = 4, Description = "Ms." );
    

    internal static IList<Title> GetTitles()
    
        return _colTitles;
    

(当然,稍后会从数据库中获取这些内容)。

这个简单的任务超出了我作为 WPF 开发人员的才能。

如何将 ItemsSource 设置为这个静态类?如何进一步将 DisplayMemberPath 设置为底层 Title 对象的 Description 属性?

我应该将 SelectedValue 和 SelectedValuePath 设置为什么?

真的希望有人能帮我解决一个我无法解决的看似简单的问题。

谢谢, 灰色

【问题讨论】:

没有时间给出一个完整的答案,但为什么不在您的 ViewModel 中创建一个属性,从您的“模型”返回数据?在这种情况下,您的模型是静态类 - 稍后,它将是您用于从数据库中获取数据的任何内容。这样一来,当您更改模型时,您的视图绑定不会改变(这是 MVVM 的要点之一 - 关注点分离)。 【参考方案1】:

在你的 viewModel 中创建一个像这样的属性:

public IList<Title> VmTitles

    get
    
        return Titles.GetTitles();
    


private Title _selectedTitle;
public Title SelectedTitle

    get
    
        return _selectedTitle;
    
    set
    
        if (value != _selectedTitle)
        
            _selectedTitle = value;
            OnPropertyChanged("SelectedTitle");
        
    

然后在您的 .xaml 中执行以下操作:

<ComboBox x:Name="cboTitle" ItemsSource="Binding Path=VmTitles" DisplayMemberPath="Description" SelectedItem="Binding Path=SelectedTitle" />

【讨论】:

Hi lee O :) .. 我能问一下 Title SelectedTitle 的这个属性有什么作用吗? +1。我刚刚添加了 _selectedTitle 私有成员的声明,以帮助那些了解这些东西的含义的人。【参考方案2】:
<ComboBox x:Name="cboTitle" SelectedValuePath="TitleId" DisplayValuePath="Description" SelectedValue="Binding PropertyToBeUpdatedHere"/>

然后在您的代码中设置组合框的项目源..

cboTitle.ItemsSource = Titles.GetTitles();

【讨论】:

@WonkotheSane 嗨,你能帮我吗? 查看我对该问题的评论 @WonkotheSane 你能告诉我如何创建这些东西吗?我对你的建议很感兴趣。我也是这里的新手:( 查看 Lee O 的回答 - 看起来差不多。此外,谷歌“Josh Smith MVVM Example”对 MVVM 有很好的介绍。 @WonkotheSane 为什么要公开 IList 类型的公共属性并在那里发布静态方法?每次构建组合框时都会触发吗?【参考方案3】:

只需使用 ObjectDataProvider。

<UserControl.Resources>
    <ObjectDataProvider x:Key="cboSource" ObjectType="local:Titles" MethodName="GetTitles"/>
</UserControl.Resources>

    <ComboBox ItemsSource="Binding Source=StaticResource cboSource">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="Binding Description"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

ps:您必须将内部静态更改为公共静态。

【讨论】:

如果您的视图模型提供列表,它会更 mvvm 并且更容易:)

以上是关于WPF 组合框和数据绑定到其他类的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据源绑定到 datagridview 组合框和复选框

DataGridTemplateColumn 绑定在 WPF 中使用文本框和 MVVM

WPF CommandParameter 绑定未更新

WPF 数据绑定:如何使用 XAML 将枚举数据绑定到组合框? [复制]

DataGrid中的WPF绑定到DataContext

将枚举属性数据绑定到 WPF 中的组合框