int 类型的属性在 WPF 中的代码隐藏中更改时不会反映在 UI 中?



这是我的XAML代码:

<Label x:Name="currentPage" Width="45" Height="25" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="{Binding CurrentPageNo, Mode=OneWay}" />

这是我的代码:

private int currentPageNo;
public int CurrentPageNo
{
get { return currentPageNo; }
set { currentPageNo = value; NotifyPropertyChanged("CurrentPageNo"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void gotoPrevious(object sender, RoutedEventArgs e)
{ this.currentPageNo--;}
private void gotoPrevious(object sender, RoutedEventArgs e)
{ this.currentPageNo++;}

当我按下下一页按钮或上一页按钮时,currentPageNo会改变,但这不会反映在UI中。

当我这样做时,它会工作。

private int currentPageNo;
public int CurrentPageNo
{
get { return currentPageNo; }
set { currentPageNo = value; NotifyPropertyChanged("currentPageNo"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void gotoPrevious(object sender, RoutedEventArgs e)
{ 
this.currentPageNo--;
NotifyPropertyChanged("currentPageNo");
}
private void gotoPrevious(object sender, RoutedEventArgs e)
{ 
this.currentPageNo++;
NotifyPropertyChanged("currentPageNo");
}

我必须从所有地方通知我改变的值。这感觉不对。我错过什么了吗?还是应该用第二种方式?

您必须通过使用属性的名称来通知属性的更改,而不是使用其支持字段的名称

那么你也应该增加和减少属性,而不是字段。

private int currentPageNo;
public int CurrentPageNo
{
get { return currentPageNo; }
set
{
currentPageNo = value;
NotifyPropertyChanged(nameof(CurrentPageNo)); // property name
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void GotoPrevious(object sender, RoutedEventArgs e)
{ 
CurrentPageNo--; // set the property
}
private void GotoPrevious(object sender, RoutedEventArgs e)
{ 
CurrentPageNo++; // set the property
}

不带支持字段的替代实现如下所示。属性设置器是私有的,以确保只有所属类可以设置属性。它必须总是触发PropertyChanged事件。

public int CurrentPageNo { get; private set; }
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void GotoPrevious(object sender, RoutedEventArgs e)
{ 
CurrentPageNo--;
NotifyPropertyChanged(nameof(CurrentPageNo));
}
private void GotoPrevious(object sender, RoutedEventArgs e)
{ 
CurrentPageNo++;
NotifyPropertyChanged(nameof(CurrentPageNo));
}

最新更新