我在XAML中有以下代碼片段。TextBlock Text屬性在更新其源Binding屬性時未更新?
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="01*"/>
<ColumnDefinition Width="03*"/>
<ColumnDefinition Width="01*"/>
</Grid.ColumnDefinitions>
<Button Name="btnPrevious" Grid.Column="0" Content="Previous" Click="btnPrevious_Click"/>
<TextBlock Name="txtBlockName" Grid.Column="1" Text="{Binding SelectedName, UpdateSourceTrigger=PropertyChanged}" FontSize="30" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Button Name="btnNext" Grid.Column="2" Content="Next" Click="btnNext_Click"/>
</Grid>
這會生成如圖1所示的以下輸出。
這背後的代碼如下所示。
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public List<string> namesList = new List<string>();
public string SelectedName
{
get
{
return namesList[1];
}
set
{
if (value != namesList[1])
{
namesList[1] = value;
NotifyPropertyChanged("SelectedName");
}
}
}
public MainWindow()
{
InitializeComponent();
namesList.Add("ABC");
namesList.Add("DEF");
namesList.Add("GHI");
this.DataContext = this;
}
private void btnPrevious_Click(object sender, RoutedEventArgs e)
{
string str = namesList[0];
namesList[0] = namesList[1];
namesList[1] = str;
this.IsEnabled = false;
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
string str = namesList[2];
namesList[2] = namesList[1];
namesList[1] = str;
this.IsEnabled = false;
}
protected void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
TextBlock
的該Text
屬性綁定到SelectedName
屬性。並且在更新SelectedName
屬性時不會更新它。雖然我的班級實施了INotifyPropertyChanged
界面並定義了其NotifyPropertyChanged
行爲,但它仍然無效。
在調試時,我放了一些斷點來觀察SelectedName
屬性值,我發現它按照要求更新,但TextBlock
的Text
屬性沒有更新。如圖2所示。
我已經看到了很多關於互聯網的問題和解決方案,但沒有解決我的問題。任何幫助,將不勝感激。
我對我的代碼和Dan的代碼感到困惑嗎?請澄清他們與我的區別。謝謝 –
@Peter,100%與你在一起,我不知道「IsEnabled = false」意味着要做什麼,得出的結論是相同的,但我不想在代碼中引入太多差異來指出改變通知錯過...我認爲這是問題的意圖 – Dan
@Waqas:你的原始代碼和Dan的帖子中的答案之間的顯着區別在於,當值改變時,Dan提升了'SelectedName'屬性的'PropertyChanged'事件,同時你的代碼沒有。只有第一次點擊按鈕時,你的兩個代碼示例才能正常工作。我的例子與你的代碼有相同的區別,它引發了'PropertyChanged'事件,不同之處在於它可以用於隨後的按鈕點擊,而不僅僅是第一次按鈕點擊。 –