ContentDialog内元素绑定状态丢失:复选框关闭重开恢复默认
问题原因与解决方案
你遇到的问题不是ContentDialog的已知问题,核心原因是每次打开菜单页面时,都新建了一个MenuViewModel实例,之前修改的ShowFPS状态没有被保留,所以重新打开后会回到默认的false。
解决思路与实现方案
方案1:复用MenuViewModel实例(保持内存状态)
把MenuViewModel改成单例模式,确保整个应用生命周期内只有一个实例,这样状态会一直保留:
修改MenuViewModel代码:
namespace NScumm.MonoGame.ViewModels { public class MenuViewModel : ViewModel, IMenuViewModel { // 全局单例实例 private static MenuViewModel _instance; public static MenuViewModel Instance => _instance ??= new MenuViewModel(); private bool _showFPS; public bool ShowFPS { get { return _showFPS; } set { RaiseAndSetIfChanged(ref _showFPS, value); } } // 私有构造函数,禁止外部直接实例化 private MenuViewModel() {} } }
然后修改页面构造函数,使用单例实例:
public MainMenuPage() { InitializeComponent(); Vm = MenuViewModel.Instance; DataContext = Vm; }
方案2:持久化状态到本地存储(重启应用也能保留)
如果需要重启应用后依然保留设置,可以把ShowFPS的状态保存到本地设置中:
修改MenuViewModel的ShowFPS属性:
namespace NScumm.MonoGame.ViewModels { public class MenuViewModel : ViewModel, IMenuViewModel { private bool _showFPS; public bool ShowFPS { get { // 从本地设置读取,默认值为false if (Windows.Storage.ApplicationData.Current.LocalSettings.Values.TryGetValue("ShowFPS", out var storedValue)) { _showFPS = (bool)storedValue; } return _showFPS; } set { if (RaiseAndSetIfChanged(ref _showFPS, value)) { // 将修改后的值保存到本地设置 Windows.Storage.ApplicationData.Current.LocalSettings.Values["ShowFPS"] = value; } } } } }
页面构造函数不需要修改,这样每次打开页面时,ViewModel会从本地读取之前保存的状态,修改后也会自动保存。
内容的提问来源于stack exchange,提问作者user237251
相关产品推荐
相关产品推荐

