【问题标题】:WPF - MVVM - View doesn't update when changing properties of a VM instanceWPF - MVVM - 更改 VM 实例的属性时视图不会更新
【发布时间】:2021-06-09 21:03:17
【问题描述】:

我对 MVVM 和 WPF 还很陌生,所以对我所说的一切持保留态度。我的问题非常复杂,过去一天我一直在努力寻找解决方案。无济于事...

上下文

我正在尝试自己制作一个 POS 系统。一切都按计划进行。直到:当扫描的条形码太短时,我会打开一个小视图,询问文章的尺寸和颜色代码。这是通过 ICommand 完成的。

我可以写一篇文章并将其添加到我的 ObservableCollection 中。我使用我在 ViewModel 之外创建的实例来访问这个可观察的集合。

但是现在奇怪的事情发生了,我更新了一个“total” texblock 和一个“amount” textblock。这些更改通过,我可以看到正在填充的属性,并且我的 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);
    }
}

询问大小 - 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}"/>

截图#

picture of the POS, it's in Dutch so sorry in advance, Stuks/Aantal = AMOUNT

非常感谢您来到这里尝试帮助我。我希望我可以学习并解决这个问题。我今天下午读了很多书,单身可能不是最好的办法,但我似乎想不出更好的方法。

【问题讨论】:

    标签: c# wpf mvvm viewmodel icommand


    【解决方案1】:
    1. 确保 MainViewModel.Instance 是 MainWindow 的 DataContext。最简单的方法是指定属性:DataContext="{x:Static local:MainViewModel.Instance}"

    2. 您需要将TextBox.Text 绑定指定为{Binding PropertyName, Mode=TwoWay}

    编辑:

    如果 Cart 通过 ListBox 或 ComboBox 在 UI 中公开,您还可以指定 TextBox 应使用其选择的值作为 Binding 的参考点,如下所示:Text="{Binding ElementName=nameOfTextBoxInXAML, Path=SelectedItem.PropertyOnSelectedValue"

    使用此语法可确保您的文本框始终使用所选项目的值。

    【讨论】:

    • 好吧,您的 1. 确实解决了我的问题!事实证明,像这样分配我的数据上下文是不正确的!非常感谢:&lt;Window.DataContext&gt; &lt;local:MainViewModel&gt;&lt;/local:MainViewModel&gt; &lt;/Window.DataContext&gt; 这是不是因为它不是我的实例和其他东西还是我错了?
    • 事实上,您正在创建两个不同的 MainViewModel 实例。第一个是有效的new MainViewModel(),上面的XAML 由&lt;local:MainViewModel&gt; 指示。第二个是 MainViewModel.Instance。由于您说新窗口有效,因此可以假设您将新窗口 MainViewModel.Instance 作为其上下文。
    • 请注意,Mode=TwoWay 是 TextBox 类的 Text 属性的默认值。并且在 TextBlock 的 Text 属性的绑定上设置它是没有意义的,它只显示文本,但从不修改它。
    • 欣赏小伙子们!我确实期待这样的事情,但无法弄清楚!祝你有美好的一天!
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多