每次单击按钮时,都会将更新的变量数据分配给TextBlock

问题描述 投票:1回答:3

我正在尝试创建一个小程序,而如果单击“增加”按钮,则数字将添加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
3个回答
1
投票

你有正确的想法,但你有几个缺失的部分:

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

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


1
投票

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

你大部分都在那里。


-1
投票

number属性的set方法未触发OnPropertyChanged事件。点击此处查看https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification的详细信息

© www.soinside.com 2019 - 2024. All rights reserved.