【问题标题】:Assign updated variable data to a TextBlock everytime a button is clicked每次单击按钮时将更新的变量数据分配给 TextBlock
【发布时间】:2019-09-03 21:11:26
【问题描述】:

我正在尝试创建一个小程序,如果单击增加按钮,数字将加 1,反之亦然。

我设法将 _number 值绑定到 TextBlock(最初设置为 0),但是当我单击按钮时,似乎没有添加或减去该值。或者,如果值更改但未在窗口上更新。

.xaml

// MainWindow.xaml
<Window x:Class="Home_Test.MainWindow"
    ...
    Title="MainWindow" Height="450" Width="800">
<Grid Name="MainGrid">
    <Button ...
            Content="Add" 
            Click="increase"/>
    <Button ...
            Content="Subtract"
            Click="decrease"/>
    <TextBlock 
             Name="txtbox"
             HorizontalAlignment="Center" 
             Height="23" 
             TextWrapping="Wrap" 
             Text="{Binding Path=Number}" 
             Width="120"
             Margin="0,100,0,0" />
</Grid>

.xaml.cs

using System;
using System.Windows;
using System.ComponentModel;
using System.Runtime.CompilerServices;
...

namespace Home_Test
{
    public partial class MainWindow : INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

    private int _number = 0;
    public int Number
    {
        get { return _number; }
        set
        {
            if (_number != value)
            {
                _number = value;
            }
        }
    }

    public void increase(object sender, RoutedEventArgs e)
    {
        _number += 1;
    }
    public void decrease(object sender, RoutedEventArgs e)
    {
        _number -= 1;
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

}

总的来说,我希望我的程序在单击按钮时会加 1 或减 1。 我在这里做错了吗?

【问题讨论】:

    标签: c# wpf xaml desktop-application


    【解决方案1】:

    你的想法是对的,但你有几个缺失的部分:

    1) XAML UI 正在监视 Number 属性的更改,以便它可以更新,但您的 increase()decrease() 方法仅更新支持变量。您必须直接设置Number 属性。

    2) Number 上的 setter 方法需要告诉 XAML UI 在更改时进行更新。这是通过在属性设置器中调用 OnPropertyChangedEvent 来完成的 - 请参阅 https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface(它谈到了 windows 窗体,但机制是相同的)

    【讨论】:

      【解决方案2】:

      您的 XAML 看起来不错。只是为了澄清一下,您没有将 _number 绑定到 TextBlock。 _number 是私有变量,UI 无法访问。您应该将公共属性 Number 数据绑定到 TextBlock。

      正如 MarcE 在他的帖子中所描述的,问题出在您的 ViewModel 中。 Number 属性的 Setter 需要调用您的 PropertyChanged 方法,需要添加该方法;并且您的增减方法需要直接修改Number 属性,而不是其支持变量。 当您只修改支持变量时,您的属性的 setter 永远不会被调用,因此 UI 永远不会更新。

      下面显示的是需要修改的代码:

      private int _number = 0;
      public int Number
      {
          get { return _number; }
          set
          {
              if (_number != value)
              {
                  _number = value;
                  //After the setter updates the backing variable, this Updates the UI.
                  NotifyPropertyChanged("Number");
              }
          }
      }
      
      public void increase(object sender, RoutedEventArgs e)
      {
          Number += 1;
      }
      public void decrease(object sender, RoutedEventArgs e)
      {
          Number -= 1;
      }
      

      添加此代码以使NotifyPropetyChanged 功能正常工作。

      public event PropertyChangedEventHandler PropertyChanged;
      
      public void NotifyPropertyChanged(string propertyName)
      {
        if (PropertyChanged != null)
        {
          PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
      }
      

      你的大部分时间都在那里。

      【讨论】:

        【解决方案3】:

        number 属性的 set 方法未触发 OnPropertyChanged 事件。详情请看这里https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-21
          • 2021-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多