在我的应用中,我有很多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。缺点:控制数据库上下文。
答案 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}" />