MVVM を使用して ListBox の項目を ViewModel にバインドする際の規則はありますか?
以下の XAML では、ボタンの ListBox を作成しています。ListBox は、ViewModel からの監視可能なコレクションにバインドされています。次に、ボタンの Command プロパティを ICommand にバインドします。問題は、そのバインドを追加すると、ViewModel ではなくデータ オブジェクトに対してバインドされることです。
MyListOfDataObjects プロパティを ViewModel のリストに変更するだけですか? もしそうなら、どこでそれらの新しいオブジェクトをインスタンス化しますか? いくつかの依存関係があるため、依存関係の挿入を使用することをお勧めします。GetData ラムダを変更しますか?
一般的に、ここで良い習慣と見なされるものは何ですか? この状況の例は見つかりませんでしたが、かなり一般的だと思います。
私は MVVMLight フレームワークを使用していますが、他のフレームワークも検討したいと考えています。
<Window x:Class="KeyMaster.MainWindow"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="MyDataTemplate">
<Button Command="{Binding ButtonPressedCommand}"
CommandParameter="{Binding .}"
Content="{Binding Name}" />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<ListBox ItemsSource="{Binding MyListOfDataObjects}"
ItemTemplate="{StaticResource MyDataTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"
IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ListBox>
</Grid>
</Window>
標準の MVVMLight ViewModel を使用しています。
using GalaSoft.MvvmLight;
using KeyMaster.Model;
using System.Collections.ObjectModel;
namespace KeyMaster.ViewModel
{
public class MainViewModel : ViewModelBase
{
private readonly IDataService _dataService;
private ObservableCollection<MyData> _myListOfDataObjects;
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(item, error) =>
{
if (error != null)
{
return;
}
MyListOfDataObjects = new ObservableCollection<MyData>(item);
});
}
public ObservableCollection<MyData> MyListOfDataObjects
{
get { return _myListOfDataObjects; }
set
{
if (_myListOfDataObjects == value) return;
_myListOfDataObjects = value;
RaisePropertyChanged(() => MyListOfDataObjects);
}
}
}
}
ありがとう。