首页 文章

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

提问于
浏览
1

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

当我直接绑定模型的可观察集合时,它可以工作 . 当我将数据绑定到视图模型公开的模型的可观察集合时,它不会 . 这是一个XAML / C#Windows Store 8.1应用程序 .

What I currently get out of my skeleton test

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

What I want

1
a

这是我的骨架测试

I have an Item 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;
    }
}

The Model class 包含一个可观察的项目集合

public class Model
{
    public Model()
    {
    }

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

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

我有一个 ViewModel 暴露了Model的可观察集合

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

我的 MainPage 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之外还要公开其他内容 .

我在StackOverflow上尝试了各种博客帖子和事情,但无济于事 . 帮助赞赏 .

1 回答

  • 0

    请检查 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>
    ...
    

相关问题