【问题标题】:WPF View Model update but View not updateWPF 视图模型更新但视图未更新
【发布时间】:2021-09-23 07:50:49
【问题描述】:

当我以编程方式更新视图模型时,我使用 MVVM 视图不会更新。

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

我的模型:

public class Payment:ViewModelBase
{
    private long _paymentId;
    private decimal _price;

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long PaymentId {
        get { return _paymentId; }
        set
        {
            _paymentId = value;
            OnPropertyChanged(nameof(PaymentId));
        }
    }

    public decimal Price {
        get { return _price; }
        set
        {
            _price = value;
            OnPropertyChanged(nameof(Price));
        }
    }
}

我的视图模型:

class PaymentFactorViewModel : ViewModelBase
{
    public PaymentFactorViewModel()
    {
        PaymentFactor = new PaymentFactor();
        PaymentFactor.Price=350,000;
    }

    private Payment _paymentFactor;
    public Payment PaymentFactor
    {
        get { return _paymentFactor; }
        set
        {
            _paymentFactor = value;
            
            OnPropertyChanged(nameof(PaymentFactor));
        }
    }
}

我的看法:

<TextBox x:Name="txtPrice" Text="{Binding PaymentFactor.Price,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged"/>

当我更改 TextBox.Text 时,ViewModel 会更新,但是当我以编程方式更改 ViewModel 时,View 不会更新。

例如,我在 ViewModel 构造函数中设置 PaymentFactor.Price=350,000 但 TextBox.Text 为 0。

【问题讨论】:

  • 什么是PaymentFactor?您只发布了Payment
  • 这是我的视图模型中的支付模型。
  • 您没有指定数据上下文,例如元素名称
  • 另外,请出示完整的 xaml 代码
  • 我在 Xaml 中定义了 DataContext:

标签: c# wpf mvvm


【解决方案1】:

您发布的代码中有几个错误。

PaymentFactorViewmodel 应该是公开的

在 350000 内输掉 ,

你没有 PaymentFactor 类,你有 Payment。我看不出那段代码是怎么编译的。

以下内容对我来说没问题。或者至少它显示 350000 正如我所期望的那样。

我把所有东西都放在一个命名空间中。

        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="1200">
    <Window.DataContext>
        <local:PaymentFactorViewModel/>
    </Window.DataContext>
    <Grid>
        <TextBox x:Name="txtPrice" Text="{Binding PaymentFactor.Price,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>


public class PaymentFactorViewModel : ViewModelBase
{
    public PaymentFactorViewModel()
    {
        PaymentFactor = new Payment();
        PaymentFactor.Price=350000;
    }

    private Payment _paymentFactor;
    public Payment PaymentFactor
    {
        get { return _paymentFactor; }
        set
        {
            _paymentFactor = value;
       
            OnPropertyChanged(nameof(PaymentFactor));
        }
    }
}

public class Payment:ViewModelBase
{
    private long _paymentId;
    private decimal _price;
    public long PaymentId {
        get { return _paymentId; }
        set
        {
            _paymentId = value;
            OnPropertyChanged(nameof(PaymentId));
        }
    }

    public decimal Price {
        get { return _price; }
        set
        {
            _price = value;
            OnPropertyChanged(nameof(Price));
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多