当我更新绑定的属性时,我似乎在更新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属性中的任何值。调用increment会正确地更新模型,并且直接递增Count属性(如代码所示)也能正常工作。
这里的问题是,PropertyChanged事件处理程序似乎从未添加到。我可以遍历调试器中的代码并查看属性更新中的值,甚至可以看到对OnPropertyChanged的调用,但PropertyChanged处理程序本身始终为空。
我的绑定可能有问题吗?
我正在使用MSVC 2010 Express。
发布于 2010-06-19 11:02:52
问题是您作为实例变量_model使用的WpfModel与用作窗口DataContext的实例不是同一个实例。因此,它不受任何约束,并且它的PropertyChanged将始终为空。
将用于设置datacontext的XAML更改为:
<Window.DataContext>
<vm:AppModel x:Name="_model" />
</Window.DataContext>
去掉在后台代码中声明的实例变量,并修复OnPropertyChanged实现(使用参数而不是文字字符串"prop"),它就可以工作了。
发布于 2010-06-18 21:20:05
这一行:
var e = new PropertyChangedEventArgs("prop");
应该是:
var e = new PropertyChangedEventArgs(prop);
您正在传递字符串"prop“,因此侦听"Count”的绑定值将不会被触发。
**编辑**基于您的其他评论(答案?)我想我最好用一个修复来更新它-你当然可以使用已经给出的答案,但我不想复制别人:)。
将此代码添加到您的单击处理程序:
((AppModel)this.DataContext).Count += 1;
https://stackoverflow.com/questions/3073085
复制