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、あなたのリンクされた投稿は私を正しい軌道に乗せました!