我有一个项目字典,我想在组合框中显示项目的一个方面 - 所有这些都在MVVM模式中。在这方面,我将Model
定义为:
public class Model
{
public Dictionary<UInt32, string> samples { set; get; }
}
和我的ViewModel
:
internal class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
var smpls = new Dictionary<UInt32, string>();
smpls.Add(1, "one");
smpls.Add(2, "two");
models = new Dictionary<string, Model>();
models.Add("aKey", new Model() { samples = smpls });
key = "aKey";
}
private Dictionary<string, Model> _models;
public Dictionary<string, Model> models { set { _models = value; } get { return _models; } }
private string _key;
public string key { set { _key = value; OnPropertyChanged("key"); } get { return _key; } }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
然后我将models
绑定到一个组合框:
<Grid>
<ComboBox ItemsSource="{Binding Path=models[{Binding Path=key}].samples, Mode=OneTime}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Border>
<StackPanel>
<TextBlock Text="{Binding Path=Value}" />
</StackPanel>
</Border>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
我将models
词典的键绑定到key
viewModel
的{{1}}属性,但这不起作用。但是,如果我将代码更改为以下内容,则一切正常:
<ComboBox ItemsSource="{Binding Path=models[aKey].samples, Mode=OneTime}">
答案 0 :(得分:3)
虽然models[aKey].samples
是有效的property path,但models[{Binding Path=key}].samples
却不是。您可能通过使用具有适当值转换器的MultiBinding来解决此限制。
然而,创建一个额外的视图模型属性会更容易,如下面显示的CurrentSamples
属性,只要key
属性发生更改,该属性就会更新:
public Dictionary<UInt32, string> CurrentSamples
{
get { return models[key].samples; }
}
public string key
{
get { return _key; }
set
{
_key = value;
OnPropertyChanged("key");
OnPropertyChanged("CurrentSamples");
}
}
然后像这样绑定ItemsSource:
<ComboBox ItemsSource="{Binding CurrentSamples}">
...
</ComboBox>
答案 1 :(得分:1)
我将模型字典的键绑定到viewModel的键属性,但不起作用。
绑定通过反映到CLR结构来工作。它使用Path
属性中的文字来查找CLR实例上的属性。 models[{Binding Path=key}]
不是结构中正确的路径。
它没有被编程为在绑定中搜索绑定;它将文本作为路径的文字。
引用MSDN Binding Sources Overview: 对于CLR属性,只要绑定引擎能够使用反射访问绑定源属性,数据绑定就会起作用。
所以第二个绑定(Path=models[aKey].samples
)有效,因为你提供了一个真正的 pathed 位置来反射和绑定。