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

时间:2012-05-30 15:07:47

标签: c# wpf data-binding mvvm

所有

我真的陷入了一个非常基本的概念 - 我找不到我真正理解的答案。

我有一个视图 - viewContacts。它的datacontext是一个viewmodel - viewmodelContacts。

在视图中我有'标题'的组合框(你知道......先生,夫人,小姐等)。我想绑定itemssource,以便显示一个选项列表,并绑定SelectedValue,以便将密钥存储在viewmodelContacts TitleId属性中。

'source'列表,如果标题(我想将ItemsSource绑定到)实际上是在一个单独的静态类中 - 注意不是viewmodel!

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设置为什么?

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

谢谢, 灰色

3 个答案:

答案 0 :(得分:2)

在你的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}" />

答案 1 :(得分:1)

<ComboBox x:Name="cboTitle" SelectedValuePath="TitleId" DisplayValuePath="Description" SelectedValue="{Binding PropertyToBeUpdatedHere}"/>

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

cboTitle.ItemsSource = Titles.GetTitles();

答案 2 :(得分:0)

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