绑定内部绑定WPF

时间:2015-05-07 15:22:11

标签: c# wpf mvvm binding

我有一个项目字典,我想在组合框中显示项目的一个方面 - 所有这些都在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}">

2 个答案:

答案 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 位置来反射和绑定。