簡體   English   中英

WPF - MVVM - 更改 VM 實例的屬性時視圖不會更新

[英]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));

        }
    }

詢問大小 - VM

這是一個小版本,因為發生的不止這些,但這就是它的要點。 我的母語也有部分內容,所以我盡力翻譯。

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);
    }
}

詢問尺寸 - XAML

            <TextBox>
                <TextBox.InputBindings>
                    <KeyBinding Key="Enter" Command="{Binding SizeColorCommand}" CommandParameter="{Binding Path=Text, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}" />
                </TextBox.InputBindings>
            </TextBox>

MainVM - XAML

            <TextBlock Text="{Binding TotalStr, Mode=TwoWay}"/>

截屏#

POS 的圖片,它是荷蘭語,所以提前抱歉,Stuks/Aantal = AMOUNT

非常感謝你能走這么遠來幫助我。 我希望我可以學習並解決這個問題。 我今天下午讀了很多書,singleton 可能不是最好的選擇,但我似乎想不出更好的方法。

  1. 確保 MainViewModel.Instance 是 MainWindow 的 DataContext。 最簡單的方法是指定屬性: DataContext="{x:Static local:MainViewModel.Instance}"

  2. 您需要將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM