当从视图模型公开 ObservableCollection 时,如何对从 ObservableCollection 公开的属性进行数据绑定?

How to databind properties exposed from an ObservableCollection when the ObservableCollection is exposed from a view model?

当 ObservableCollection 从视图模型公开时,我无法找到正确的绑定语法来对 ObservableCollection 中包含的项目的属性进行数据绑定。

当我直接对模型的可观察集合进行数据绑定时,它起作用了。当我数据绑定视图模型公开的模型的可观察集合时,它不会。这是一个 XAML/C# Windows Store 8.1 应用程序。

我目前从骨架测试中得到了什么

{binding Path=ID}
{binding Path=Letter}

我想要什么

1
a

这是我的骨架测试

我有一个项目class

项目存储在可观察集合中,我最终想绑定 ID 和 Letter 属性:

public class Item
{
    public Item(int id, char letter)
    {
        ID = id;
        Letter = letter;
    }

    public int ID
    {
        get;
        set;
    }

    public char Letter
    {
        get;
        set;
    }
}

模型 class 包含可观察的项目集合

public class Model
{
    public Model()
    {
    }

    public ObservableCollection<Item> Items
    {
        get
        {
            return _theItems;
        }
        set
        {
            _theItems = value;
        }
    }

    ObservableCollection<Item> _theItems = new ObservableCollection<Item>();
}

我有一个 ViewModel 公开模型的可观察集合

public class ViewModel
{
    public ViewModel(Model model)
    {
        _model = model;
    }

    public ObservableCollection<Item> theItems
    {
        get
        {
            return _model.Items;
        }
    }

    private Model _model;
}

我的 MainPage 构造函数使用一些测试数据创建模型,创建 ViewModel,并将页面的 DataContext 设置为视图模型:

public MainPage()
{
    this.InitializeComponent();

    Model model = new Model();

    // some test data
    model.Items.Add(new Item(1, 'a'));

    _viewModel = new ViewModel(model);
    this.DataContext = _viewModel;
}

我的主页XAML看起来像这样

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
     <GridView ItemsSource="{Binding Path=theItems}" >
        <GridView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock>{binding Path=ID}</TextBlock>
                    <TextBlock>{binding Path=Letter}</TextBlock>
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
</Grid>

此测试框架旨在简化但模仿我的真正目标,即拥有一个公开多个内容的视图模型,其中之一是我要绑定其不同属性的对象的可观察集合。但是绑定项目的属性从可观察的集合中暴露出来让我望而却步。

我假设我的问题与 XAML 绑定语法有关。我在想,因为我将页面的 DataContext 设置为 ViewModel,所以将 GridView 的 ItemsSource 设置为 theItems 将允许我引用集合中项目的 ID 和 Letter 属性。

当我直接将模型的 ObservableCollection 绑定到 MainPage 的 DataContext 时,一切正常。但这偏离了我对 ViewModel 的目标,即公开除了 ObservableCollection 之外的其他东西,我想从单一视图模型绑定到它。

我在 Whosebug 上尝试了各种博客文章和此处提到的内容,但均无济于事。帮助表示赞赏。

请检查您的 XAML 绑定。

...
<TextBlock Text="{Binding ID, Mode=OneTime}"/>
<TextBlock Text="{Binding Letter, Mode=OneTime}"/>
...

考虑更改 DataTemplate

...
<DataTemplate>
    <TextBlock>
        <TextBlock.Inlines>
            <Run Text="{Binding ID,Mode=OneTime}"/>
            <Run Text=" - "/>
            <Run Text="{Binding Letter,Mode=OneTime}"/>
        </TextBlock.Inlines>
    </TextBlock>
</DataTemplate>
...