【发布时间】:2017-07-30 20:48:34
【问题描述】:
我已经搜索并阅读了大量类似的主题,还观看了一些视频,但我遇到了一些问题,我认为这归结为一些误解。我正在使用 MVVM 和 UWP 开发来学习 70-357 考试。
我的目标:在我的 XAML 页面中按下一个按钮,让它在我的 ViewModel 中更改一个对象的属性,然后让该值反映在我的 XAML 视图中的数据绑定中。
在我的项目中,我有以下内容:
主页 XAML
<StackPanel Name="HPStack" Margin="0,0,10,0">
<Button Name="HPIncrease" Click="{x:Bind CharacterViewModel.HPIncrease_Click}" Content="+" HorizontalAlignment="Center"/>
<TextBlock Name="HPTB" Text="{x:Bind CharacterViewModel.myCharacter.CurrentHP}" Margin="0,0,5,0" HorizontalAlignment="Center"/>
<Button Name="HPDecrease" Click="{x:Bind CharacterViewModel.HPDecrease_Click}" Content="-" HorizontalAlignment="Center"/>
</StackPanel>
MainPage C#
public CharacterDetailsViewModel CharacterViewModel;
public MainPage()
{
this.InitializeComponent();
CharacterViewModel = new CharacterDetailsViewModel();
}
字符视图模型(大部分代码来自我看到的解释here
public class CharacterDetailsViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//App data
private Character _myCharacter;
public Character myCharacter
{
set
{
_myCharacter = value;
OnPropertyChanged();
}
get { return _myCharacter; }
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
//Constructors
public CharacterDetailsViewModel()
{
_myCharacter = new Character(12, 12, 12, 12, 12, 12);
}
//buttons
public void HPIncrease_Click(object sender, RoutedEventArgs e)
{
//TODO probably fix this
myCharacter.CurrentHP++;
}
public void HPDecrease_Click(object sender, RoutedEventArgs e)
{
myCharacter.CurrentHP--;
}
}
字符模型(去掉很多不相关的属性)
public class Character
{
public int TotalHP { get; set; } //TODO not public
public int CurrentHP {get;set;} //TODO check vs total HP and 0
//constructor for creating a new character with provided stats
public Character (int strength, int dexterity, int constitution, int intelligence, int wisdom, int charisma)
{
this.TotalHP = 50;
this.CurrentHP = 45;
}
}
- 我的所有属性最初似乎都能正确找到
- 当我单击按钮更改 CurrentHP 时,我没有看到 XAML 上反映了这一点
- 我知道存在 prism 和 template 10。我不想使用它们,因为我正在编写此代码以更好地理解这些东西以准备认证。将来我可能会利用它们,但我试图找出在这种情况下我做错了什么。
到目前为止,我的理解是我应该只将 INotfyPropertyChanged 放在 ViewModel 上,它可以处理自定义对象(在本例中为字符)内的任何属性已更改的警报。
我错了吗? 我的 Character 类是否需要 INotifyPropertyChanged 才能正确提醒 XAML 这些更改?
感谢您在此提供的任何意见。
【问题讨论】:
-
请使用
Command而不是click事件。 -
请在
INotifyPropertyChanged上课。 -
我看到两件事:是的,您应该更改属性以通知 UI,第二 - 您已将绑定定义为 OneTime - 将其更改为 OneWay 如果您想查看更改。
-
是的,您需要为
CurrentHP加薪PropertyChanged。或者至少你可以为myCharacter属性提高它,视图可以用新值更新它 -
@NikhilAgrawal 你有关于Command和Click之间区别的好资源我可以看看吗?
标签: c# xaml mvvm uwp inotifypropertychanged