[英]C# WPF MVVM - View doesn't change when Item Added to ObservableCollection in VM Instance
[英]WPF - MVVM - View doesn't update when changing properties of a VM instance
我對 MVVM 和 WPF 還很陌生,所以對我所說的一切持保留態度。 我的問題非常復雜,過去一天我一直在努力尋找解決方案。 無濟於事...
我正在嘗試自己制作一個POS系統。 一切都按計划進行。 直到:當掃描的條形碼太短時,我會打開一個小視圖,詢問文章的尺寸和顏色代碼。 這是通過 ICommand 完成的。
我可以寫一篇文章並將其添加到我的 ObservableCollection 中。 我使用從 ViewModel 創建的實例訪問這個可觀察的集合。
但是現在奇怪的事情發生了,我更新了一個“總”文本塊和一個“數量”文本塊。 通過這些更改 go ,我可以看到屬性正在填充並且我的 OnPropertyChanged 正在被觸發,但視圖上沒有任何內容可看。 奇怪的是我的 ObservableCollection 正在改變,但我的文本框沒有。 我非常確信我的 ICommand 沒有任何問題,因為我可以創建實際文章並將其添加到我的購物車中。 我一直在嘗試調試一段時間,我可以看到它正在以正確的值通過我的屬性的設置器。 奇怪的是,如果我添加了這樣的文章,文本塊將是錯誤的,但是當我以另一種方式(通過原始 VM - 不是新窗口)添加新文章時,它需要正確的總數和數量。 就像我的視圖不想更新,我不知道如何強制它更新。
我一直在努力尋找一種讓一切正常的方法,希望有人可以讓我了解我做錯了什么,因為我幾乎一無所知::D
下面的代碼中可能存在輸入錯誤或類似的內容,但我很確定您可以忽略最基本的內容。 我正在實施一切,改變正在經歷它只是沒有出現。
(這些屬性在我的主虛擬機中)
private static string _totalstr { get; set; }
public string TotalStr
{
get { return _totalstr; }
set
{
_totalstr = value;
OnPropertyChanged(nameof(TotalStr));
}
}
private static ObservableCollection<Art> _cart;
public ObservableCollection<Art> Cart
{
get
{
return _cart;
}
set
{
_cart = value;
OnPropertyChanged(nameof(Cart));
}
}
這是一個小版本,因為發生的不止這些,但這就是它的要點。 我的母語也有部分內容,所以我盡力翻譯。
public ICommand SizeColorCommand { get; set; }
public SizeColorViewModel()
{
this.SizeColorCommand = new SizeColorCommand(this);
}
public void function(object parameter)
{
MainViewModel.Instance.Cart.Add(artikel);
MainViewModel.Instance.Total += (double)article.EVkp;
MainViewModel.Amount++;
MainViewModel.Instance.TotaalStr = String.Format("{0:c}", MainViewModel.Instance.Total);
}
class SizeColorCommand: ICommand
{
public SizeColorViewModel VM { get; set; }
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public SizeColorCommand(SizeColorViewModel vm)
{
VM = vm;
}
public bool CanExecute(object parameter)
{
string query = parameter as string;
if (string.IsNullOrWhiteSpace(query))
return false;
return true;
}
public void Execute(object parameter)
{
VM.function(parameter);
}
}
<TextBox>
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding SizeColorCommand}" CommandParameter="{Binding Path=Text, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}" />
</TextBox.InputBindings>
</TextBox>
<TextBlock Text="{Binding TotalStr, Mode=TwoWay}"/>
POS 的圖片,它是荷蘭語,所以提前抱歉,Stuks/Aantal = AMOUNT
非常感謝你能走這么遠來幫助我。 我希望我可以學習並解決這個問題。 我今天下午讀了很多書,singleton 可能不是最好的選擇,但我似乎想不出更好的方法。
確保 MainViewModel.Instance 是 MainWindow 的 DataContext。 最簡單的方法是指定屬性: DataContext="{x:Static local:MainViewModel.Instance}"
您需要將TextBox.Text
綁定指定為{Binding PropertyName, Mode=TwoWay}
。
編輯:
如果通過 ListBox 或 ComboBox 在 UI 中公開Cart
,您還可以指定 TextBox 應使用其選定值作為綁定的參考點,如下所示: Text="{Binding ElementName=nameOfTextBoxInXAML, Path=SelectedItem.PropertyOnSelectedValue"
使用此語法可確保您的文本框始終使用所選項目的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.