【发布时间】:2018-01-11 18:16:29
【问题描述】:
我遇到了一个特殊的问题,将两个文本框数据绑定到同一个对象可以正常工作,但是在我通过 XML 反序列化将数据加载回我的程序后,其中一个文本框的绑定失败。
我使用 splitview 构建一个小汉堡导航菜单并将我的页面加载到框架中
这是我的 MainPage.xaml 中相关的 XAML
<TextBlock Name="PlayerGoldTextBlock"
RelativePanel.RightOf="PlayerNameTextBlock"
RelativePanel.AlignVerticalCenterWithPanel="True"
Foreground="Gold"
FontSize="28"
Text="{x:Bind myGame.Game.Player.Gold, Mode=OneWay}" />
<TextBlock Name="RemainingTurnsTextBlock"
RelativePanel.RightOf="PlayerGoldTextBlock"
RelativePanel.AlignVerticalCenterWithPanel="True"
Foreground="Red"
Text="{x:Bind myGame.Game.RemainingTurns, Mode=OneWay}" />
<SplitView.Content>
<Frame Name="MyFrame"></Frame>
</SplitView.Content>
在我已经加载到框架中的页面中:
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<TextBlock Text="Gold:" HorizontalAlignment="Left" FontSize="16" Margin="0,0,10,0"/>
<TextBlock Text="{x:Bind myGame.Game.Player.Gold, Mode=OneWay}" HorizontalAlignment="Left" FontSize="16" Margin="0,0,10,0"/>
</StackPanel>
在 MainPage 中:PlayerGoldTextBlock 在我加载后无法正确绑定,但 RemainingTurnsTextBlock 工作正常
在我的框架中:x:Bind myGame.Game.Player.Gold 在我加载后似乎重新绑定就好了。
另一件可能相关的事情是,在加载时我看到 RemainingTurnsTextBlock 立即更新,但框架中的(工作)播放器黄金直到我导航到不同的框架然后返回
这是我的反序列化代码,以防万一:
async public void LoadGame()
{
var filename = "testsave.xml";
var serializer = new XmlSerializer(typeof(GameModel));
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync(filename).AsTask().ConfigureAwait(false);
Stream stream = await file.OpenStreamForReadAsync().ConfigureAwait(false);
GameModel myGame;
using (stream)
{
myGame = (GameModel)serializer.Deserialize(stream);
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
this.Player = myGame.Player;
this.Locations = myGame.Locations;
this.RemainingTurns = myGame.RemainingTurns;
});
}
}
这是我的 GameModel 中的一些属性
public Player Player { get; set; }
public int MaxTurns { get; set; }
private int remainingTurns;
public int RemainingTurns
{
get { return remainingTurns; }
set { SetProperty(remainingTurns, value, () => remainingTurns = value);}
}
这是播放器中的黄金属性
private int gold;
public int Gold
{
get { return gold; }
set {SetProperty(gold, value, () => gold = value);}
}
这里是设置属性
protected bool SetProperty<T>(T currentValue, T newValue, Action DoSet,
[CallerMemberName] String property = null)
{
if (EqualityComparer<T>.Default.Equals(currentValue, newValue)) return false;
DoSet?.Invoke();
RaisePropertyChanged(property);
return true;
}
根据 XY 问题评论进行编辑以澄清问题陈述:
- 我有绑定到 Game.Player.Gold 的东西
- 在启动时它们运行良好
- 在进行 XML 反序列化并加载保存的状态后,当我离开并返回时,一些绑定工作,但有些完全死了
- 当我更改播放器实例或其他东西时,绑定似乎不喜欢,因为它无法深入了解黄金属性的位置。对我来说很奇怪,框架中的一个文本框可以在我导航后重新绑定,但主窗口中的一个文本框不能
- 我找到了解决此问题的方法,除了 Game.Player.Gold 之外,直接在 Game.Player 上使用设置器,但我发现其他属性也出现了一些类似的问题。
- 我是否对这些事物如何看待彼此有一些误解?
【问题讨论】:
-
你是如何声明你的属性的?你在用 Fody 吗?
-
在我相信的相关属性中进行了编辑。我不确定 Fody 是什么,所以可能不会使用它。如果它是一个框架,我只是自己构建了这一切来学习 UWP 的东西,而现在我正在用它来玩 XML 序列化之类的东西。
-
你是如何声明 SetProperty 的?
-
看起来我编辑的代码被编辑回来了,我稍后再添加。代码的哪一部分显示为不可读?这一切都显示在我的浏览器中带有格式和语法的代码块中。
-
我想是的:你压平了一些标签,我会在粘贴之前压平东西。干杯。
标签: c# xaml data-binding uwp