WPF中的绑定内部绑定

3

我有一个条目的字典,我想在组合框中展示其中的一些方面,并且要使用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字典的键绑定到viewModelkey属性上,但不起作用。然而,如果我按照以下方式更改代码,一切都正常:

<ComboBox ItemsSource="{Binding Path=models[aKey].samples, Mode=OneTime}">
2个回答

3
虽然models[aKey].samples是一个有效的属性路径,但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>

我同意这是解决我的问题的最佳方法,并且比我尝试的方式更简单地使MVVM受益。然而,我认为在这里使用MultiBinding是不必要的负担;你提出的方法是我认为最简单的。 - Dr. Strangelove

1
我将模型字典的键绑定到viewModel的key属性上,但却没有起作用。绑定通过反射进入CLR结构来实现。它使用Path属性中的文字查找CLR实例上的属性(通常)。models[{Binding Path=key}]不是结构中适当的路径。它未被编程为在绑定中搜索另一个绑定;它将文本作为路径的文字量。因此,第二个绑定(Path=models[aKey].samples)有效,因为您提供了一个真正可以反射并绑定的路径位置。根据MSDNBinding Sources Overview的话来说:“对于CLR属性,只要绑定引擎能够使用反射访问绑定源属性,数据绑定就可以工作”。

所以基本上,我做的方式在技术上是“不可能”的,我想最好的解决方法是Clemens建议的方法。 - Dr. Strangelove
1
@hamed 我建议你考虑更改结构并使用集合视图源,您可以通过过滤要显示的不同视图源来实现。 - ΩmegaMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接