我有两个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中 请帮忙
答案 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();
}
}
我希望你能得到这个想法,这会有所帮助。