私はPrism MVVMフレームワークでWPFアプリケーションを開発しています。また、親ビューモデルと子ビューモデルの間でデータが正しくどのように正しく渡されるかはわかりません。WPFアプリケーションで子ビューモデルプロパティにバインドする方法はありますか
私は2つのビューモデルParentViewModelと内部ChildViewModelを持っています。
public class ParentViewModel
{
public ParentViewModel
{
ChildViewModel = new ChildViewModel(params);
}
private ChildViewModel _childViewModel;
public ChildViewModel ChildViewModel
{
get { return _childViewModel; }
set
{
SetProperty(ref _childViewModel, value);
}
}
//This is does not work
public int SelectedChildNumber
{
return _childViewModel.SelectedNumber;
}
}
public class ChildViewModel
{
public ChildViewModel
{
_numbers = new List<int>();
}
private List<int> _numbers;
public List<int> Numbers
{
get { return _numbers; }
set
{
SetProperty(ref _numbers, value);
}
}
private int _selectedNumber;
public int SelectedNumber
{
get { return _selectedNumber; }
set
{
SetProperty(ref _selectedNumber, value);
}
}
}
子ビューモデルから選択した値を取得して使用します。私のアプローチは動作しません - ChildViewModelでSelectedNumberが変更された場合、SelectedChildNumberは更新したくありません。
更新: 私はChildViewModelコレクションをParentViewModelに持っていますか?このChildViewModelの1つに、IsSelectedプロパティがtrueと等しいプロパティがあります。選択した1つのビューモデルをコレクションから取得するにはどうすればよいですか?
public class ParentViewModel
{
public ParentViewModel
{
Items = GetItems();
}
private ObservableCollection<ChildViewModel> _items;
public ObservableCollection<ChildViewModel> Items
{
get
{
return _items;
}
set
{
SetProperty(ref _items, value);
}
}
}
public class ChildViewModel
{
public ChildViewModel
{
}
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
SetProperty(ref _isSelected, value);
}
}
}
選択したビューモデルを取得するにはどうすればよいですか?多分コンバータを使用しますか?
<someUserControl DataContext="{Binding ParentViewModel.Items, Converter={x:Static c:GetSelectedItemConverter.Instance}}" />
コンバーターでは、選択したアイテムを見つけることができます。またはこれは悪い考えですか?
UPDATE 2:
[OK]を、私はエドプランケットの助けを借りて、この問題を破りました。最終版は次のようになります。子プロパティに直接
public class ParentViewModel
{
public ParentViewModel
{
Items = GetItems();
foreach (var item in Items)
{
item.PropertyChanged += ChildViewModel_PropertyChanged;
}
}
private ObservableCollection<ChildViewModel> _items;
public ObservableCollection<ChildViewModel> Items
{
get
{
return _items;
}
set
{
SetProperty(ref _items, value);
}
}
private ChildViewModel _selectedChild;
public ChildViewModel SelectedChild
{
get { return _selectedChild; }
set
{
SetProperty(ref _selectedChild, value);
}
}
private void ChildViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
var child = (ChildViewModel)sender;
if (e.PropertyName == nameof(ChildViewModel.IsSelected) && child.IsSelected)
{
SelectedChild = child;
}
}
}
SelectedNumberセッターでPropertyChangedイベントを発生させていますか? – taquion
私はPrismフレームワークを使用しているので、PropertyChangedイベントを手動で呼び出す必要はありません。 – Oblomingo
@taquion 'SetProperty()'はそれを行います。彼はとてもいい。 –