我想在 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,您的链接帖子使我走上了正轨!