我真的不明白。
我创建了一个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
答案 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
内添加一个位置,以便在FirstObject
或SecondObject
为空等时添加其他逻辑,如处理