【发布时间】:2013-01-29 15:34:58
【问题描述】:
我想在 LongListSelector 中显示对象列表,并使用 DataTemplate 对其进行格式化。为了正确使用 MVVM,我想在这个 DataTemplate 中有一个 ViewModel。
这个ViewModel的创建没有问题,但是如何将Item传递给ViewModel呢?
我正在使用此代码:
<Controls:LongListSelector
ItemsSource="{Binding MyItems}" Margin="0" HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch" >
<Controls:LongListSelector.DataContext>
<viewmodel:MyListOfItemsViewModel />
</Controls:LongListSelector.DataContext>
<Controls:LongListSelector.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="CurTemplate">
<Grid Margin="10" >
<Grid.DataContext>
<viewmodel:MyViewModel MyItem="{Binding Path=DataContext,ElementName=CurTemplate}" />
</Grid.DataContext>
但是很可惜,为 MyItem 设置的唯一内容是 null,并且永远不会更新为实际值。我发现在这个过程的后期(在MyItem CurTemplate 的初始设置之后确实有一个有效的DataContext,但这并没有发送到我的ViewModel。我在这里遗漏了什么吗?
为了完整起见,MyViewModel 的代码:
public static DependencyProperty MyItemProperty = DependencyProperty.Register("MyItem", typeof(object), typeof(MyViewModel), new PropertyMetadata("asd", ItemChanged));
private static void ItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
System.Diagnostics.Debugger.Break(); // to set when something is set
// called once, NewValue is null
}
public object MyItem
{
get
{
return (object)GetValue(MyItemProperty);
}
set
{
SetValue(MyItemProperty, value);
RaisePropChangeEvent("MyItem");
}
}
我做了很多搜索和摆弄,但我很确定这只是这里缺少的一件小事。如果你能在这里帮助我,我会很高兴...
编辑:已解决
我通过使用{Binding Path=Content,RelativeSource={RelativeSource Mode=TemplatedParent}} 作为视图模型的绑定解决了我的问题。我不知道为什么这适用于Content,但不适用于DataContext...
感谢您的帮助,robertftw,您的链接帖子让我走上了正轨!
【问题讨论】:
标签: c# xaml data-binding windows-phone-8