我有内容控件和两个单选按钮所在的主窗口. MainWindow.xaml:
<Grid>
<StackPanel >
<RadioButton Content="First"
IsChecked="True"
Command="{Binding FirstViewCommand}"/>
<RadioButton Content="Second"
Command="{Binding SecondViewCommand}"/>
</StackPanel>
<ContentControl Grid.Row="1"
Grid.Column="1"
Content="{Binding CurrentView}"/>
</Grid>
我将我的用户控件绑定到此内容控件.这里我有组合框、列表框和按钮.基于Cobobox.SelectedElement我需要在按下按钮后更改列表框中的数据. 用户控制:
<Grid>
<ComboBox x:Name="BoxOfDetails"
ItemsSource="{Binding DetailsScheme}">
</ComboBox>
<Button Command="{Binding ProduceCommand}"
CommandParameter="{Binding ElementName=BoxOfDetails, Path=SelectedItem}" />
<ListBox x:Name="ListOfMaterials"
ItemsSource="{Binding Materials}" >
</ListBox>
</Grid>
我还有Main View Model,它是主窗口的数据上下文:
class MainVM : ObservableObject
{
public RelayCommand FirstViewCommand { get; set; }
public RelayCommand SecondViewCommand { get; set; }
public FirstVM FirstViewModel { get; set; }
public SecondVM SecondViewModel { get; set; }
private object _currentView;
public object CurrentView
{
get { return _currentView; }
set => Set(ref _currentView, value);
}
public MainVM()
{
FirstViewModel = new FirstVM();
SecondViewModel = new SecondVM();
CurrentView = FirstViewModel;
FirstViewCommand = new RelayCommand(o =>
{
CurrentView = FirstViewModel;
});
SecondViewCommand = new RelayCommand(o =>
{
CurrentView = SecondViewModel;
});
}
和我的用户控件的查看模型:
class FirstVM : ObservableObject
{
private ObservableCollection<DetailScheme> _detailsScheme;
private ObservableCollection<Material> _materials;
public ObservableCollection<DetailScheme> DetailsScheme
{
get => _detailsScheme;
public ObservableCollection<Material> Materials
{
get => _materials;
set => Set(ref _materials, value);
}
public RelayCommand ProduceCommand { get; set; }
public FirstVM ()
{
_detailsScheme = GetDetailsScheme("D:/ DetailsScheme.json");
_materials = GetMaterials("D:/ Materials.json");
ProduceCommand = new RelayCommand(o =>
{***});
}
当我的用户控件切换时,我需要将信息保存在我的列表框中(对于示例用户 Select 框中的内容并按下按钮,并且切换控制后列表框中的数据现在正在更新,我得到的信息与启动应用程序时相同)
我添加了将信息保存到我的用户控件视图模型中的文件的方法:
public void SaveFirstVM()
{
SaveDetails(_details, "D:/ Details.json");
SaveMaterials(_materials, "D:/ Materials.json");
}
当我在命令的Main ViewModel中切换视图时,我try 调用它
SecondViewCommand = new RelayCommand(o =>
{
CurrentView = SecondViewModel;
FirstViewModel.SaveFirstVM()
});
但是什么都不会发生,我可以在每次按下UserControl View Model中的Product按钮后调用这个保存方法,但我认为这不是一个好方法. 我在我的项目中添加了一些断点,我只能建议问题是我的UserControl视图模型创建了两次,第一次是在MainVM中,第二次是在初始化发生时,当我更改数据时,它发生在初始化的对象中,当我试图从MainVM保存数据时,它会保存其他没有更改的对象