我在用戶控制元件中有一個資料網格(實際上是 Cart),其中有一個按鈕(稱為“添加”)。下面是截圖鏈接。
https://photos.app.goo.gl/ftGn4e36REwxHVwb9
當我點擊這個 ADD 按鈕時,一個視窗會打開,顯示產品,我把數量和其他細節放在這個第二個視窗上點擊提交。下面是截圖鏈接——
https://photos.app.goo.gl/ftBsx1TdKC4WyLNz9
現在的問題是,當我單擊此提交按鈕時,有一個方法 CALled Load 更新資料網格,稱為 LoadDGStockIN() 由按鈕方法“BtnActionSaveNewStockntry()”呼叫,但在用戶控制元件 ui 中的 Datagrid 中沒有更改或更新。
請幫助我在這個領域很新。這是兩個 UI 的視圖模型。
using Pharma.Model;
using Pharma.View;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;
namespace Pharma.ViewModel
{
internal class VM_StockIn : INotifyPropertyChanged
{
#region get set properties
private string _VendorName;
public string VendorName
{
get { return _VendorName; }
set { _VendorName = value; }
}
private string _MRP;
public string MRP
{
get { return _MRP; }
set { _MRP = value; }
}
#endregion
public VM_StockIn()
{
MRP = "contrustor loaded";
}
#region Button ADD NEW STOCK
private ICommand _BtnAddNewStock;
public ICommand BtnAddNewStock
{
get
{
return _BtnAddNewStock ?? (_BtnAddNewStock = new CommandHandler.CommandHandler(() => BtnAddNewStock_Action(), () => CanExecute));
}
}
BackgroundWorker backgroundWorker = new();
Window_StockEntry window;
private void BtnAddNewStock_Action()
{
window = new();
window.Show();
threadNo = Thread.CurrentThread.ThreadState.ToString();
}
#endregion
#region Button New Stock Entry SAVE
//public ICommand btnNewStockEntrySave { get; set; }
#endregion
private ObservableCollection<Stock> _DGISrcStockIn = new ObservableCollection<Stock>();
public ObservableCollection<Stock> DGISrcStockIn
{
get { return _DGISrcStockIn; }
set { _DGISrcStockIn = value; }
}
public void LoadDGStockIN()
{
Thread.Sleep(1000);
DGISrcStockIn = new ObservableCollection<Stock>()
{
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 01, AvailableQty = 1254, BatchNo = "DF7SE4B3" },
new Stock { SlNo = 81, AvailableQty = 1254, BatchNo = "DF7SE4B3" }
};
OnPropertyChanged(nameof(DGISrcStockIn));
//MessageBox.Show("Datagrid Load Complete");
VendorName = "new name";
OnPropertyChanged(nameof(VendorName));
MRP = "NO MRP 01";
OnPropertyChanged(nameof(MRP));
//OnPropertyChanged(nameof(View.User_Control.UC_StockIn));
}
#region OnProperty Block
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
#region button New Stock Entry SAVE
private ICommand _btnNewStockEntrySave;
public ICommand btnNewStockEntrySave
{
get
{
return _btnNewStockEntrySave ?? (_btnNewStockEntrySave = new CommandHandler.CommandHandler(() => BtnActionSaveNewStockntry(), () => CanExecute));
}
}
public bool CanExecute
{
get { return true; }
}
private void BtnActionSaveNewStockntry()
{
LoadDGStockIN();
}
#endregion
}
}
uj5u.com熱心網友回復:
您的 ObservableCollection _DGISrcStockIn 不使用 OnPropertyChanged 介面。你必須像這樣在公共集之后呼叫它
private ObservableCollection<Stock> _DGISrcStockIn = new ObservableCollection<Stock>();
public ObservableCollection<Stock> DGISrcStockIn
{
get { return _DGISrcStockIn; }
set { _DGISrcStockIn = value; OnPropertyChanged(); }
}
uj5u.com熱心網友回復:
在提交對話框后,我看不到任何代碼,您可以在其中將專案添加到可觀察串列。
將呼叫函式“LoadDGStockIN”,并使用始終相同的靜態專案初始化屬性“DGISrcStockIn”。
您需要從對話框中提取資料并將它們添加到系結的可觀察串列中。
uj5u.com熱心網友回復:
問題解決了 !為此,無需在此處使用執行緒。創建時只需將視圖模型傳遞給新視窗。
window = new();
window.DataContext = this;
window.Show();
它解決了我的問題。如果有人有更好的方法請評論或回答。那將是高度appriciated。
uj5u.com熱心網友回復:
你打破了 SOLID(這個,單一職責)。為什么 ICommand 包含在 ViewModel 中?
創建類Command:
class Command : ICommand
{
private Action<object> _execute;
private Func<object, bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested = value; }
remove { CommandManager.RequerySuggested -= value; }
}
public Command(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || CanExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
}
創建模型和視圖模型:
class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
class ProductViewModel
{
//for DataGrid. ObservableCollection implements INotifyPropertyChanged
public ObservableCollection<Product> Products { get; set; }
public ProductViewModel()
{
Products = new ObservableCollection<Product>();
Products.Add(new Product { Name = "Apple", Price = 1});
Products.Add(new Product { Name = "Banana", Price = 2});
}
public Command AddProductCommand
{
get => new Command((_) =>
{
Products.Add(new Product { Name = "Orange", Price = 3 });
});
}
}
XAML (MainWindow.xaml):
<DataGrid ItemsSource="{Binding Products}"></DataGrid>
<Button Content="Add product" Command="{Binding AddProductCommand}"></Button>
主視窗.xaml.cs:
class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ProductViewModel();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388362.html
上一篇:如何從桌面應用程式WPF中的按鈕單擊重定向到網站?[復制]
下一篇:如何創建兩個變數列
