WPF字典按键绑定不起作用

时间:2013-03-04 10:12:37

标签: binding windows-8 dictionary resources key

我真的不明白。

我创建了一个viewmodel-class,它包含两个对象,如下所示:

public class MyViewModel{

public MyFirstObject FirstObject {get;set;}
public MySecondObject SecondObject {get;set;}

...
// Constructors and so on...
}

FirstObject看起来像这样:

public class MyFirstObject {

    public int Id {get;set;}
    ...
    // Constructors and so on...
    }

}

MySecondObject包含一个词典:

    public class MySecondObject{

            public Dictionary<int, string> MyDict {get;set;}
            ...
            // Constructors and so on...
            }
}

我现在要做的是获取一个键的dictionarys值,这是对MyFirstObject.Id的反驳 - 就像这样:

mySecondObject.myDict[myFirstObject.Id]

在C#中执行此操作很简单,但现在我想在xaml中执行此操作。 我创建了一个UserControl并将DataContext设置为MyViewModel-reference。

之后,我尝试了这个:

<TextBox Text={Binding SecondObject[FirstObject.Id]} ../>

不幸的是,这不起作用,因为无法找到键'FirstObject.Id'。

有谁知道如何解决这个问题?

非常感谢! CodeCannibal

1 个答案:

答案 0 :(得分:1)

不要在XAML中执行此操作。只需在viewmodel上创建一个新属性,它封装了这个逻辑。

您还可以委派PropertyChangedEvent来传播您的价值变化:

public class MyViewModel : INotifyPropertyChanged {

    private MyFirstObject firstObject;
    public MyFirstObject FirstObject
    {
        get { return firstObject; }
        set { firstObject = value; PropertyChanged("MyDictValue"); }
    }

    private MySecondObject secondObject;
    public MySecondObject SecondObject
    {
        get { return secondObject; }
        set
        {
            secondObject = value; PropertyChanged("MyDictValue");
            // you can subscribe here also for your MyDict changes if it is an
            // observable and you can call PropertyChanged("MyDictValue"); 
            // in the change event etc
        }
    }

    public string MyDictValue 
    { 
        get { return SecondObject.MyDict[FirstObject.Id]; } 
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

并绑定到您的新属性:

<TextBox Text={Binding MyDictValue} ../>

使用此方法,您可以在MyDictValue内添加一个位置,以便在FirstObjectSecondObject为空等时添加其他逻辑,如处理