首页 > 解决方案 > 当事件发生在 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 中请帮助

标签: c#wpf

解决方案


好的,所以我再次阅读了您的代码。这是一种方法。当您打开第二个窗口时。将您的 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();
  }
}

我希望你明白这个想法,这会有所帮助。


推荐阅读