2013-03-04 66 views
0

我真的不明白。WPF词典通过键绑定不起作用

我创建了一个视图模型类,其中包含两个对象,像这样的:

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价值的关键,这是一个refence到MyFirstObject.Id - 这样的:

mySecondObject.myDict[myFirstObject.Id] 

在C#这样做很容易,但现在我想在xaml中执行此操作。 我创建了一个UserControl并将DataContext设置为MyViewModel引用。

在那之后,我尝试这样做:

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

不幸的是这是行不通的,因为键“FirstObject.Id”无法找到。

有没有人有一个想法如何解决这个问题?

非常感谢! CodeCannibal

回答

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为空等处理额外的逻辑,如处理

+0

嗯 - 我试过,但这只适用于我f值永远不会更新:) 我实现了一个ObservableCollection对象,以确保该值始终是最新的。绑定到'MyDictValue'不会这样做。 这里是另一个我忘记评论的重要通知:我正在开发一个win8应用程序 - 而不是一个wpf应用程序。我试图将多重绑定与转换器结合使用,但多赢不再是win 8应用程序的支持者。 – CodeCannibal 2013-03-04 10:50:42

+0

是的值不会更新,但你没有在你的问题中提到你想要更新。但没有什么能阻止你委派这些事件。你可以在你的FirstObject和SecondObject设置器中触发'PropertyChanged(“MyDictValue”)''。如果你的SecondObject是/有一个'ObservableCollection',你可以订阅它的事件,你可以触发'PropertyChanged(“MyDictValue”)等等。 – nemesv 2013-03-04 11:14:57

+0

哦 - 知道我明白了。谢谢 - 这是我正在寻找的解决方案。如果我得到它的工作,我会在这里发布我的解决方案。 – CodeCannibal 2013-03-04 11:17:20