如何解决WPF MVVM-将多个View / ViewModel绑定到同一基本ViewModel
我有一个使用MVVM模式的WPF应用程序。顶部有5-6个标签的视图。每个选项卡都是一个包含表单的视图,然后将数据加载到该表单下方的视图中。
每个选项卡式视图中的表单几乎相同,其中几个仅具有一个附加字段。我要这样做,以便当用户在一个选项卡上填写表单时,当您切换到另一个选项卡时,表单值将自动带入您在其他选项卡中输入的内容。
我现在尝试使用的实现包括一个“ BaseViewModel”,其中包括这样的属性
private string _SelectedProjectCollection;
public string SelectedProjectCollection
{
get => _SelectedProjectCollection;
set
{
_SelectedProjectCollection = value;
OnPropertyChanged(nameof(SelectedProjectCollection));
}
}
然后,各个选项卡的ViewModels继承自BaseViewModel,并包含这样的代码
public string SelectedProjectCollection
{
get => base.SelectedProjectCollection;
set
{
base.SelectedProjectCollection = value;
OnPropertyChanged(nameof(SelectedProjectCollection));
if (value != null)
{
RefreshProjectList();
}
}
}
我需要将它们放入单独的ViewModel选项卡,因为它们的每个RefreshProjectList方法将应用略有不同的逻辑,因此我无法将第二个代码块放入BaseViewModel中。
我已经设置了断点来监视数据流。当一个选项卡填写表单时,BaseViewModel的属性似乎发生了变化,但是当我切换到另一选项卡时,尽管表单的ComboBox被赋予了绑定,该表单也不会用Base中的值填充。
xaml示例中的ComboBox绑定:
<ComboBox Grid.Row="0" Grid.Column="0" materialDesign:HintAssist.Hint="Project Collection" IsEditable="True" Style="{StaticResource MaterialDesignFloatingHintComboBox}" ItemsSource="{Binding Path=ProjectCollectionList}" SelectedItem="{Binding Path=SelectedProjectCollection,Mode=TwoWay}"></ComboBox>
任何将我拉向正确方向的建议将不胜感激。
解决方法
一种解决方法是使用合成。如果您使用所需的数据属性创建类,则可以在行为类中将它们代理出来。
public class MyData : INotifyPropertyChanged
{
private string _myProp;
public string MyProp
{
get => _myProp;
set
{
_myProp = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
}
public class ViewModel : INotifyPropertyChanged
{
private readonly MyData _data;
public ViewModel(MyData data)
{
_data = data;
}
public string MyProp
{
get => _data.MyProp;
set => _data.MyProp = value;
}
public event PropertyChangedEventHandler PropertyChanged
{
add => _data.PropertyChanged += value;
remove => _data.PropertyChanged -= value;
}
}
注意,这将触发一个以MyData
作为发送方的事件,如果您希望ViewModel成为发送方,则您需要实现INotifyPropertyChanged
,监听该事件并用新的发送者调用外部事件。然后,您需要在放置侦听器的地方实现IDisposable
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。