当从视图模型公开ObservableCollection时,我无法找到ObservableCollection中包含的项的数据绑定属性的正确绑定语法。
当我直接绑定模型的可观察集合时,它可以工作。当我将数据绑定到视图模型公开的模型的可观察集合时,它不会。这是一个XAML / C#Windows Store 8.1应用程序。
我目前从骨架测试中获得的内容
{binding Path=ID}
{binding Path=Letter}
我想要什么
1
a
我有一个Item类
项目存储在observable集合中,我最终想要绑定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;
}
}
Model类包含一个可观察的项目集合
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上尝试了各种博客帖子和事情,但无济于事。帮助赞赏。
答案 0 :(得分: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>
...