带有自定义ItemSource绑定的WPF ComboBox

时间:2015-10-18 16:27:35

标签: c# wpf xaml combobox

在我的应用中,我有很多ComboBox用户预定义的项目列表。我不想在我的ViewModel上添加所有列表(也许我错了)。我更喜欢向MyComboBox控件(继承自ComboBox的新控件)添加一个额外的参数,其中id为list,我想从数据库加载。 E.g:

<MyComboBox ItemsSourceId = "SAMPLE_ID" SelectedItem = "{Binding valueCode}" />

在后面的代码中,我将执行查询并将结果绑定到ItemSource

SELECT itemCode, itemValue FROM UserDictionaries WHERE itemListCode = 'SAMPLE_ID'

这是好还是坏?也许你有一些示例代码? ;)

解决方案的优点:更清晰的ViewModel。缺点:控制数据库上下文。

1 个答案:

答案 0 :(得分:0)

为什么不把它放在ViewModel?这正是ViewModel的用途。如果你将它放在自定义ComboBox的代码隐藏中,这将失去MVVM的目的,因为ComboBox现在依赖于数据库。您应该努力的是拥有“松散耦合”的组件,并让ViewModel将数据提供给View

您可以执行以下操作:

public class ViewModel
{
    private _itemSource;
    public List<Entity> ItemSource 
    {
        get { return _itemSource; }
        private set 
        {
            _itemSource = value;
            RaisePropertyChanged("ItemSource");
        }
    }

    private void UpdateItemSource(int sampleId)
    {
        var newItems = SELECT itemCode, itemValue FROM UserDictionaries WHERE itemListCode = 'SAMPLE_ID';

        ItemSource = null;
        ItemSource = newItems;
    }
}

然后将您的XAML更新为:

<ComboBox ItemSource="{Binding ItemSource, UpdateSourceTrigger=PropertyChanged}" SelectedItem = "{Binding valueCode}" />