У меня, кажется, есть серьезные проблемы, заставляющие мой UI WPF обновить, когда я обновляю, когда я обновляю свойство, это связывается с. Вот мое определение класса модели представления:
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);
}
}
};
}
Это связывается с моим простым UI в следующем XAML:
<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 является всегда пустым.
Существует ли проблема с моей привязкой, возможно?
Я использую Экспресс MSVC 2010.
Проблема в том, что WpfModel, который используется в качестве переменной экземпляра, _model, не тот же экземпляр, который используется в качестве DataContext окна. Таким образом, он ни к чему не привязан, и его PropertyChanged всегда будет иметь значение null.
Измените свой XAML для установки контекста данных на это:
<Window.DataContext>
<vm:AppModel x:Name="_model" />
</Window.DataContext>
Избавьтесь от переменной экземпляра, объявленной в исходном коде, и исправьте реализацию OnPropertyChanged (используйте параметр вместо буквальной строки «prop»), и она работает .
эта строка:
var e = new PropertyChangedEventArgs("prop");
должна быть:
var e = new PropertyChangedEventArgs(prop);
Вы передаете строку "prop", поэтому связанные значения, прослушивающие "Count", не будут срабатывать.
**EDIT ** Основываясь на других ваших комментариях (Ответ?), я подумал, что лучше обновить эту статью с исправлением - конечно, вы можете использовать уже данный ответ, но я не хочу копировать кого-то другого :).
Добавьте это в обработчик нажатия:
((AppModel)this.DataContext).Count += 1;