![](/img/trans.png)
[英]Why does the binding update without implementing INotifyPropertyChanged?
[英]WPF Binding with INotifyPropertyChanged does not update
當我更新它所綁定的屬性時,我在更新時似乎遇到嚴重問題讓我的WPF UI更新。 這是我的視圖模型類定義:
namespace WpfModel
{
class AppModel : INotifyPropertyChanged
{
private int _count = 7;
public int Count { get { return _count; }
set { _count = value; OnPropertyChanged("Count"); } }
public void Increment()
{
Count++;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs("prop");
handler(this, e);
}
}
};
}
這與我在以下XAML中的簡單UI綁定:
<Window x:Class="WpfModel.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfModel"
Title="WPF Data Model Demo" Height="128" Width="284" >
<Window.DataContext>
<vm:AppModel />
</Window.DataContext>
<Grid Height="Auto" Width="Auto">
<Button Margin="0,0,12,12" Name="IncButton" Height="23" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="IncButton_Click" Content="Increment" />
<Label Content="Count Variable:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" />
<Label Height="28" Margin="116,12,0,0" Name="CountLabel" VerticalAlignment="Top" HorizontalAlignment="Left" Width="40" Content="{Binding Path=Count}" />
</Grid>
</Window>
該應用程序定義如下:
namespace WpfModel
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private AppModel _model = new AppModel();
public MainWindow()
{
InitializeComponent();
//_model = new AppModel();
}
private void IncButton_Click(object sender, RoutedEventArgs e)
{
}
}
}
當應用程序啟動時,一切都很好,標簽甚至最初顯示模型的Count屬性中的任何值。 調用增量正確更新模型,並直接遞增Count屬性,如代碼中所示也可以正常工作。
這里的問題是,PropertyChanged事件處理程序似乎永遠不會被添加到。 我可以單步執行調試器中的代碼並查看屬性更新中的值,我甚至可以看到對OnPropertyChanged的調用,但PropertyChanged處理程序本身始終為null。
我的綁定可能有問題嗎?
我正在使用MSVC 2010 Express。
問題是,你必須為一個實例變量,_model的WpfModel, 不是唯一的被用作窗口的DataContext的相同的實例。 因此,它不受任何約束,它的PropertyChanged將始終為null。
更改您的XAML以將datacontext設置為:
<Window.DataContext>
<vm:AppModel x:Name="_model" />
</Window.DataContext>
擺脫后面代碼中聲明的實例變量,並修復OnPropertyChanged實現(使用參數而不是文字字符串“prop”),它可以工作。
這一行:
var e = new PropertyChangedEventArgs("prop");
應該:
var e = new PropertyChangedEventArgs(prop);
您正在傳遞字符串“prop”,因此不會觸發偵聽“Count”的綁定值。
**編輯**基於你的其他評論(答案?)我認為我最好用修復更新這個 - 你可以使用已經給出的答案當然但我不想復制別人:)。
將其添加到您的點擊處理程序:
((AppModel)this.DataContext).Count += 1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.