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

本文关键字:数据绑定 其他 组合 WPF | 更新日期: 2023-09-27 18:35:41

all,

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

我有一个视图 - 查看联系人。 它的数据上下文是一个视图模型 - 视图模型联系人。

在视图上,我有一个用于"标题"的组合框(你知道......先生、夫人、小姐等)。 我想绑定 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 对象的"说明"属性?

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

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

谢谢灰色

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

在您的视图中模型创建一个属性,如下所示:

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}" />
<ComboBox x:Name="cboTitle" SelectedValuePath="TitleId" DisplayValuePath="Description" SelectedValue="{Binding PropertyToBeUpdatedHere}"/>

然后在代码中设置组合框的项源。

cboTitle.ItemsSource = Titles.GetTitles();

只需使用 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:您必须将内部静态更改为公共静态。