如何在WPF中的窗口2中发生事件时更新窗口1的视图

时间:2018-05-28 07:57:38

标签: c# wpf

我有两个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)); }


}

窗口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");
    }

Window 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}">..........

我也使用了聚合器订阅方法,但问题仍然是相同的模型正在更新但未反映在View中。 在窗口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中 请帮忙

1 个答案:

答案 0 :(得分:0)

好的,我再次阅读你的代码。这是一种如何做到这一点的方法。当你打开第二个窗口时。将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();
  }
}

我希望你能得到这个想法,这会有所帮助。