C# WPF多页面间的数据共享(经典)
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# WPF多页面间的数据共享(经典)相关的知识,希望对你有一定的参考价值。
概述
实现页面间的数据共享有很多方法,比如:①事件的发布订阅 ②委托
③ioc容器④静态类等,这节主要通过静态的集合实现数据的添加和获取。
实现效果如下:数据在登录页面写入字典,然后在conductor页面获取
代码解析
-. 数据写入:
public void SetData()
DataShareBase.SetData<string>(CommonConstant.OfficialAccount, "dotnet讲堂");
var loginViewModel = new LoginViewModel();
loginViewModel.UserInformation = new UserInformation()
UserName = "zls365",
Password = "abc123"
;
DataShareBase.SetData<LoginViewModel>(CommonConstant.LoginViewModelKey, loginViewModel);
-. 数据获取:
public void GetData()
string dynamicValue = DataShareBase.GetData<string>(CommonConstant.OfficialAccount);
DXMessageBox.Show(dynamicValue, CommonConstant.OfficialAccount, MessageBoxButton.OK, MessageBoxImage.Information);
LoginViewModel dynamicObject = DataShareBase.GetData<LoginViewModel>(CommonConstant.LoginViewModelKey);
StringBuilder stringBuild = new StringBuilder();
stringBuild.AppendLine(dynamicObject.UserInformation.UserName);
stringBuild.AppendLine(dynamicObject.UserInformation.Password);
DXMessageBox.Show(stringBuild.ToString(), CommonConstant.LoginViewModelKey, MessageBoxButton.OK, MessageBoxImage.Information);
写入的方法封装在类DataShareBase
using System;
using System.Collections.Concurrent;
namespace Caliburn.Micro.Hello.Helper
public class DataShareBase
private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger<DataShareBase>();
/// <summary>
/// Dynamic Data
/// </summary>
public static ConcurrentDictionary<string, object> DynamicData get; set; = new ConcurrentDictionary<string, object>();
public static void SetData(string key, object value, bool isForceWrite = true)
logger.Info($"[SetData] Enter. Key = [key], Value = [value], isForceWrite = [isForceWrite]");
if (DynamicData.Keys.Contains(key))
string logMsg = $"DynamicData key = key has existed in context.";
if (isForceWrite)
DynamicData[key] = value;
else
logger.Debug(logMsg);
try
DynamicData.TryAdd(key, value);
catch (Exception ex)
logger.Error($"[SetData] ex");
logger.Info($"[SetData] Enter. Key = [key], Value = [value], isForceWrite = [isForceWrite]");
public static void SetData<TData>(string key, TData value, bool isForceWrite = true)
SetData(key, (object)value, isForceWrite);
public static TData GetData<TData>(string key)
logger.Debug($"Enter [GetData]. Key = key.");
var data = GetData(key);
if (!(data is TData))
string logMsg = $"In [GetData<TData>] DynamicData type is not [typeof(TData)].";
logger.Error(logMsg);
throw new Exception(logMsg);
logger.Debug($"Enter [GetData]. Return ((TData)data).ToString().");
return (TData)data;
public static object GetData(string key)
if (!(DynamicData.Keys.Contains(key)))
string logMsg = $"In [GetData] DynamicData key = key not existed in context.";
logger.Error(logMsg);
throw new Exception(logMsg);
object data = null;
DynamicData.TryGetValue(key, out data);
return data;
ConcurrentDictionary是一个线程安全的字典,它的值是object类型,每次数据写入的时候会将数据转换为object,即装箱,每次取的时候会将object类型拆箱为对应的类型。
源码下载
链接:https://pan.baidu.com/s/1kE_plpDD6-CzkjEsmtigzA
提取码:6666
以上是关于C# WPF多页面间的数据共享(经典)的主要内容,如果未能解决你的问题,请参考以下文章
c# wpf的datagrid列标题间的分割线,我加background后变成一大块黑色的,怎么变成间隔的一块一块的,如图