我是第一次与WPF合作,所以请耐心等待。
我有一个组合框,用于一般显示一些查找数据。不同类型查找的模型完全相同,只是通过单个方法调用检索的不同数据源通过不同的枚举来控制返回的数据集。相当简单的东西。
public sealed class MyDataProvider
{
public enum Types
{
Green,
Blue,
Orange
}
private readonly ConcurrentDictionary<string, ObservableCollection<LookUpVm>> _lookupData =
new ConcurrentDictionary<string, ObservableCollection<LookUpVm>>();
private static readonly Lazy<MyDataProvider> lazy =
new Lazy<MyDataProvider>(() => new MyDataProvider());
public static MyDataProvider Instance => lazy.Value;
private MyDataProvider()
{
}
public ObservableCollection<LookUpVm> GreenLookupDataSource => GetLookupDataSource(Types.Green);
public ObservableCollection<LookUpVm> GetLookupDataSource(Types lookupEnum)
{
ObservableCollection<LookUpVm> lookupDataSource;
if (_lookupData.TryGetValue(lookupEnum, out lookupDataSource))
return lookupDataSource;
lookupDataSource = new ObservableCollection<LookUpVm>();
var returnedlookupDataSource =
SomeMasterSource.GetlookupDataSourceBylookupEnum(lookupEnum).OrderBy(ia => ia.Name);
foreach (var returnedLookupData in returnedlookupDataSource)
{
lookupDataSource.Add(returnedLookupData);
}
_lookupData.TryAdd(lookupEnum, lookupDataSource);
return lookupDataSource;
}
}
这适用于第0次迭代,我在其中创建了一个GreenLookupComboBox。
<ComboBox ItemsSource="{Binding Source={x:Static objectDataProviders:MyDataProvider.Instance},
Path=GreenLookupDataSource}" />
但是,我真正需要做的是设置一个组合框,它可以在父视图上设置其类型枚举值,然后直接调用GetLookupDataSource并传递枚举。我们有几十种查找类型,为每种类型定义一个新属性感觉不太理想。对于控件视图,如下所示...
<ComboBox ItemsSource="{Binding Source={x:Static objectDataProviders:MyDataProvider.Instance},
Path=GetLookupDataSource}" />
以下是我使用查找控件的地方。
<local:MyLookupControl Type=Types.Green />
这甚至可能吗?
编辑:
这是我想要完成的一个例子。
我有两个键值对列表。
那么listOne
1 - A
2 - B
3 - C
和
ListTwo
1 - X
2 - Y
3 - Z
可以通过调用方法GetList(Enum.LookupType)来访问它们。它们共享相同的ViewModel和View。但是,我需要将它们放在表单上供我的用户选择。
我正在寻找一些方法来使用XAML,就像它们出现在View上一样。
<local:MyLookupControl Method=GetList Parameter=Enum.ListOne/>
<local:MyLookupControl Method=GetList Parameter=Enum.ListTwo />
这应该显示一对组合框,一组绑定到ListOne,一组绑定到ListTwo。
答案 0 :(得分:0)
您实际上只是尝试在几个控件上设置数据绑定。只要您拥有正确的视图datacontext,这很简单。
控件可以绑定到属性(这正是您要查找的内容)。
在这里使用您编辑的示例是如何做到的:
private ObservableCollection<string> _listOne;
private ObservableCollection<string> _listTwo;
private string _selectedListOneItem;
private string _selectedListTwoItem;
public ObservableCollection<string> ListOne
{
get { return _listOne; }
set { _listOne = value; }
}
public ObservableCollection<string> ListTwo
{
get { return _listTwo; }
set { _listTwo = value; }
}
public string SelectedListOneItem
{
get { return _selectedListOneItem; }
set { _selectedListOneItem = value; }
}
public string SelectedListTwoItem
{
get { return _selectedListTwoItem; }
set { _selectedListTwoItem = value; }
}
XAML:
<ComboBox ItemsSource="{Binding ListOne}" SelectedItem="{Binding SelectedListOneItem}"/>
<ComboBox ItemsSource="{Binding ListTwo}" SelectedItem="{Binding SelectedListTwoItem}"/>
您有多种选择可以加载或获取列表。您可以在构造函数中加载它们,也可以在每次“#34;得到”时加载它们。在该物业。我建议在构造函数中加载它们。
我提供的基本上是autoprops,甚至可以进一步简化,但我想告诉你,你也可以在这些属性的getter和setter中编写代码,以进一步扩展项目。例如,当SelectedListOneItem发生更改时,您可能希望在后台触发某些内容。在这种情况下,在SET of SelectedListOneItem上,您可以设置值,但也可以运行可以更新其他属性的方法/函数。
WPF非常依赖于ViewModel和Views之间绑定的属性。在编辑之前的回复中,您使用的字段无法绑定到视图中的控件。
编辑: 如果您计划更新ViewModel中的属性,这些属性会改变视图上的内容,那么您也需要查看INotifyPropertyChanged。通过实现INotifyPropertyChanged,当属性发生变化时,视图将被更新/通知。 INotifyPropertyChanged附带了它自己的事件,您必须在属性设置中调用它。这也是一个非常有用的方法,你可以调用,这将更容易为你发起这个事件。
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
你这样称呼:
public string SelectedListOneItem
{
get { return _selectedListOneItem; }
set
{
_selectedListOneItem = value;
OnPropertyChanged();
}
}
这样,如果ViewModel中的任何其他内容更新SelectedListOneItem,您的视图将进行适当的更改。在这种情况下,它将使组合框选择您在SelectedListOneItem中设置的新值。