我正在開發與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);
}
}
}
我想要從子視圖模型中獲取並使用選定的值。我的方法無效 - 如果SelectedNumber在ChildViewModel中更改,SelectedChildNumber不想刷新。
更新: 好吧,如果我在ParentViewModel中有ChildViewModel集合會怎樣。其中一個ChildViewModels的屬性IsSelected等於true。如何從集合中獲取這一個選定的視圖模型?
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}}" />
在轉換器中,我可以找到選定的項目。或者這是個壞主意?
更新2:
好吧,我打了這個問題,埃德賓吉幫助。最終版本應該是:
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 setter中引發PropertyChanged事件? – taquion
因爲我使用Prism框架,所以我不需要提高PropertyChanged事件mannualy。 – Oblomingo
@taquion'SetProperty()'這樣做。他很好。 –