c# - 当事件发生在 WPF 的窗口 2 中时如何更新窗口 1 的视图
问题描述
我有两个 Windows 1 和 2。Window 2 从 User 获取数据,然后调用 Window 1 的方法,在此方法中它更新 Window 1 的 ViewModel 的值。但更新的值未反映在 Window 1 中。以下是我的代码 MainViewModel 。CS
public class MainViewModel : INotifyPropertyChanged
{
public MainViewModel() { }
private LoadCurrentViewModel _LoadCurrentVM;
public LoadCurrentViewModel LoadCurrentVM { get { return _LoadCurrentVM; } set { _LoadCurrentVM = value; NotifyPropertyChanged("LoadCurrentVM"); } }
private LoadingHistoryTopView _LoadHistoryTopActiveVM = new LoadingHistoryTopView();
public LoadingHistoryTopView LoadHistoryTopActiveVM { get { return _LoadHistoryTopActiveVM; } set { _LoadHistoryTopActiveVM = value; NotifyPropertyChanged("LoadHistoryTopActiveVM"); } }
private LoadCurrentViewModel _LoadCurrentViewModelData = new LoadCurrentViewModel();
public LoadCurrentViewModel LoadCurrentViewModelData { get { return _LoadCurrentViewModelData; } set { _LoadCurrentViewModelData = value; NotifyPropertyChanged("LoadCurrentViewModelData"); } }
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); }
}
Window 2 如下 public partial class Scanner : Window {
//public LoadCurrentViewModel LoadCurrentViewModelData { get; set; } = new LoadCurrentViewModel();
LoadCurrentBetween objMain = new LoadCurrentBetween();
LoadingHistory objLoadHistory = new LoadingHistory();
MainViewModel _MainViewModel = new MainViewModel();
LoadHistoryUC objLoad = new LoadHistoryUC();
public Scanner()
{
DataContext = _MainViewModel;
InitializeComponent();
}
private void PaintScan(object sender, RoutedEventArgs e)
{
//Insert Scanned values to db
DbOperations.InsertScanHistory(_MainViewModel.LoadCurrentViewModelData.Part, Convert.ToInt32(_MainViewModel.LoadCurrentViewModelData.NoofHook), 2, _MainViewModel.LoadCurrentViewModelData.Date, _MainViewModel.LoadCurrentViewModelData.Time);
//objLoad.PopulateHistory(objLoad);
objLoadHistory.PopulateHistory();
MessageBox.Show("PaintScan Done");
}
窗口1代码如下
public partial class LoadingHistory : Window
{
public List<LoadingHistoryModel> LoadhistoryVM = new List<LoadingHistoryModel>();
public LoadingHistoryTopView LoadhistorytopVM = new LoadingHistoryTopView();
public MainViewModel _MainViewModel = new MainViewModel();
public LoadingHistory()
{
InitializeComponent();
DataContext = _MainViewModel;
PopulateHistory();
}
public void PopulateHistory()
{
LoadhistoryVM = DbOperations.GetLoadHistory();
if (LoadhistoryVM.Count > 0)
{
for (var i = 0; i < LoadhistoryVM[0].GroupPartNumbers.Count(); i++)
{
switch (LoadhistoryVM[0].GroupPartNumbers[i].LinePosition)
{
case 1:
//LoadhistoryVM[i].IsLoaded = true;
break;
case 2:
PainttopView paint = new PainttopView();
paint.Hookno = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber;
paint.LinePosition = LoadhistoryVM[0].GroupPartNumbers[i].LinePosition;
paint.isEmpty = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber == 0 ? true : false;
if (!paint.isEmpty)
paint.ImgSource = "/Views/Image/Bluering.png";
else
paint.ImgSource = "/Views/Image/RedStop.png";
_MainViewModel.LoadHistoryTopActiveVM.Paint.Add(paint);
break;
case 3:
BaketopView bake = new BaketopView();
bake.Hookno = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber;
bake.LinePosition = LoadhistoryVM[0].GroupPartNumbers[i].LinePosition;
bake.isEmpty = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber == 0 ? true : false;
if (!bake.isEmpty)
bake.ImgSource = "/Views/Image/Bluering.png";
else
bake.ImgSource = "/Views/Image/RedStop.png";
_MainViewModel.LoadHistoryTopActiveVM.Bake.Add(bake);
break;
case 4:
CooltopView cool = new CooltopView();
cool.Hookno = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber;
cool.LinePosition = LoadhistoryVM[0].GroupPartNumbers[i].LinePosition;
cool.isEmpty = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber == 0 ? true : false;
if (!cool.isEmpty)
cool.ImgSource = "/Views/Image/Bluering.png";
else
cool.ImgSource = "/Views/Image/RedStop.png";
_MainViewModel.LoadHistoryTopActiveVM.Cool.Add(cool);
break;
case 5:
//LoadhistoryVM[i].IsUnloaded = true;
break;
}
_MainViewModel.LoadHistoryTopActiveVM.Hooks.Add(LoadhistoryVM[0].GroupPartNumbers[i].HookNumber);
if (i == 0)
{
_MainViewModel.LoadHistoryTopActiveVM.HookNumber = LoadhistoryVM[0].GroupPartNumbers[i].HookNumber;
_MainViewModel.LoadHistoryTopActiveVM.LinePosition = LoadhistoryVM[0].GroupPartNumbers[i].LinePosition;
_MainViewModel.LoadHistoryTopActiveVM.PartNumber = LoadhistoryVM[0].GroupPartNumbers[i].PartNumber;
_MainViewModel.LoadHistoryTopActiveVM.Workorder = LoadhistoryVM[0].GroupPartNumbers[i].Workorder;
_MainViewModel.LoadHistoryTopActiveVM.Date = LoadhistoryVM[0].GroupPartNumbers[i].Date;
}
}
}
DataContext = _MainViewModel;
}
}
Window1.xaml
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3">
<Border BorderBrush="Black" BorderThickness="1" Margin="10">
<Grid Background="White" DataContext="{Binding LoadHistoryTopActiveVM}">..........
我也使用了聚合器订阅方法,但问题仍然是相同的模型正在更新但未反映在视图中。在窗口 1 中订阅如下
public FillLoadCurrent(EventAggregator eventAggregator)
{
eventAggregator.Subscribe(this);
}
public void Handle(SignalMessage obj)
{
_MainViewModel.LoadHistoryTopActiveVM.Date = DateTime.UtcNow;
//PopulateHistory();
Console.WriteLine("I'm a car and a guard is telling me to stop!");
}
窗口 2 正在发布
var eventAggregator = new EventAggregator();
var car1 = new FillLoadCurrent(eventAggregator);
var car2 = new FillLoadCurrent(eventAggregator);
var car3 = new FillLoadCurrent(eventAggregator);
var Event = new EventEmitter(eventAggregator);
Event.SignalLoadCurrent(_MainViewModel.LoadCurrentViewModelData, objMain);
模型正在更新但未反映在 UI 中请帮助
解决方案
好的,所以我再次阅读了您的代码。这是一种方法。当您打开第二个窗口时。将您的 viewmodel 实例传递给它并将其用作 DataContext 。
例子:
public class Window1 : Window
{
// Capsulate DataContext to MainViewModel
public MainViewModel MainViewModel
{
get => this.DataContext as MainViewModel;
set => this.DataContext = value;
}
public Window1()
{
this.InitializeComponents();
// Create new MainViewModel and set DataContext (in property)
this.MainViewModel = new MainViewModel();
}
private void OpenWindow2()
{
// pass current MainViewModel to Window2
var window2 = new Window2(this.MainViewModel);
window2.Show();
}
}
public class Window2 : Window
{
public MainViewModel MainViewModel
{
get => this.DataContext as MainViewModel;
set => this.DataContext = value;
}
public Window2(MainViewModel mainViewModel)
{
// set MainViewModel to instance passed from MainWindow
this.InitializeComponents();
this.MainViewModel = mainViewModel();
}
}
我希望你明白这个想法,这会有所帮助。
推荐阅读
- java - 如何使用 Hilt 在 Android 中实现 View/Presenter;错误:匕首/依赖循环
- python - 多 CPU、GPU 上的 Python 多处理
- php - Yajra 数据表和 materializecss 响应式下拉菜单
- javascript - 将数据添加到完整日历中的资源和头部部分
- javascript - Nextjs - 在服务器端访问 url 参数
- python - 如何访问(上一个或下一个)元素并比较 django 模板中的值
- flutter - Flutter TypeAheadField 使用提供者模式
- c# - 根据条件将不同的派生类分配给基类
- python - 在 Python 中打印一个列表并为每个项目生成一个 ID 列(数字序列)
- linux - 有什么方法可以在 Ubuntu 中找到分配给应用程序的堆和堆栈的地址范围?