0

我真的不明白。

我创建了一个视图模型类,其中包含两个对象,如下所示:

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...
            }
}

我现在想要做的是获取一个键的字典值,这是对 MyFirstObject.Id 的引用 - 像这样:

mySecondObject.myDict[myFirstObject.Id]

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

之后,我尝试了这个:

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

不幸的是,这不起作用,因为找不到键“FirstObject.Id”。

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

非常感谢!代码食人族

4

1 回答 1

1

不要在 XAML 中执行此操作。只需在封装此逻辑的视图模型上创建一个新属性。

您还可以委托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中添加额外的逻辑,例如处理 if FirstObjector SecondObjectis null 等。

于 2013-03-04T10:24:28.810 回答