问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

WPF MVVM数据绑定的问题问题,怎么解决

发布网友 发布时间:2022-04-27 08:52

我来回答

2个回答

懂视网 时间:2022-04-27 13:13

MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示。

首先在ViewModel中

//属性定义
 BitmapImage _ImageSource;
 /// <summary>
 /// 显示的图标
 /// </summary>
 public BitmapImage ImageSource
 {
 get { return _ImageSource; }
 set
 {
 _ImageSource = value;
 NotifyOfPropertyChange("ImageSource");
 }
 }

 string _ImagePath;
 /// <summary>
 /// 显示的图标路径
 /// </summary>
 public string ImagePath
 {
 get { return _ImagePath; }
 set
 {
 _ImagePath = value;
 NotifyOfPropertyChange("ImagePath");
 }
 }

//初始化数据
//编辑的时候绑定数据
public GroupInfoViewModel(sys_Right_Group groupInfo, OperType type)
 {
 if (type == OperType.Edit || type == OperType.Show)
 {
 IsAdd = false;
 TitleName = "编辑分组";
 RightGroup = groupInfo;
 ImagePath = groupInfo.ImagePath; 
 GetImgData(groupInfo.ImagePath);
 }
 }
 /// <summary>
 /// 获取图片数据
 /// </summary>
 /// <param name="imgPath">相对路径</param>
 private void GetImgData(string imgPath)
 {
 if (string.IsNullOrEmpty(imgPath)) return;
 try
 {
 
 string fileName = System.Environment.CurrentDirectory + imgPath; //获取文件的绝对路径
 byte[] buf;
 if (!PathToByte(fileName, out buf))
 {
  MessageHelper.ShowAutoCloseWarning("获取图标失败");
  return;
 }
 ImageSource =ByteToImage(buf);
 }
 catch (Exception ex)
 {
 throw ex;
 }
 }

//界面选择图片按钮事件
 /// <summary>
 /// 修改图片
 /// </summary>
 public void ChangedIcon()
 {
 try
 {
 OpenFileDialog open = new OpenFileDialog();
 open.Filter = string.Format("照片|*.jpg;*.jpeg;*.png;*.gif;*.bmp");
 if (open.ShowDialog() == true)
 {
  var path = open.FileName;
  //检查图标目录,绝对路径下面
  string NewPath = System.Environment.CurrentDirectory + @"ImagesTileGroup";
  string newFile = NewPath + Path.GetFileName(path);
  if (!System.IO.Directory.Exists(NewPath))
  {
  System.IO.Directory.CreateDirectory(NewPath);
  }
  File.Copy(path, newFile, true); //复制文件到目录绝对路径文件夹
  FileInfo info = new FileInfo(newFile); //新文件
  if (info.Length > MenuViewModel.UserImageMaxLength)
  {
  MessageHelper.ShowAutoCloseWarning(string.Format("图标不能大于{0}M",
  MenuViewModel.UserImageMaxLength / 1024 / 1024));
  return;
  }
  byte[] buf;
  if (!PathToByte(path, out buf))
  {
  MessageHelper.ShowAutoCloseWarning("修改失败");
  return;
  }
  ImageSource = ByteToImage(buf);
  ImagePath = @"ImagesTileGroup" + Path.GetFileName(path); //显示相对路径

 }
 }
 catch (Exception ex)
 {

 throw ex;
 }
 }

点击保存的时候再把相对路径保存到数据库RightGroup.ImagePath = ImagePath;

//公共帮助方法

//把图片文件转换为byte数组
 public static bool PathToByte(string path, out byte[] buffer)
 {
 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
 try
 {
 buffer = new byte[fs.Length];
 fs.Read(buffer, 0, (int)fs.Length);
 return true;
 }
 catch (Exception ex)
 {
 buffer = null;
 return false;
 }
 finally
 {
 if (fs != null)
 {
  //关闭资源 
  fs.Close();
 }
 }
 
 }

//把byte数组转化为BitmapImage 
 public static BitmapImage ByteToImage(byte[] buf)
 {
 BitmapImage bmp = new BitmapImage();
 bmp.BeginInit();
 bmp.StreamSource = new MemoryStream(buf);
 bmp.EndInit();

 return bmp;
 }

View 界面绑定代码:

<Button Grid.Row="0" Grid.Column="0" Content="选择图片" cm:Message.Attach="[Click]=[ChangedIcon()]" Style="{StaticResource BtnOperationStyle}" Height="20" Width="70"></Button>
  <Grid Grid.Row="0" Grid.Column="1" Background="LightGray">
  <Image Height="120" Width="150" Stretch="Fill" Source="{Binding ImageSource,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></Image>
 </Grid>
 <Label Grid.Row="1" Grid.Column="0" Style="{StaticResource GridColumnLabelStyle}" Content="路径:"></Label>
<TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource StyleForTextBox}" Text="{Binding ImagePath,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Height="30" TextAlignment="Center" IsReadOnly="True"></TextBox>

界面效果:

热心网友 时间:2022-04-27 10:21

具体问题呢?
MVVM 模式 其实还是很简答
掌握MVVM模式最重要是有
绑定
命令
基本OOP
以上三点基本就可以实现简单WPF的MVVM了啊
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...女孩 姓陆 2011年11月26号03点24分 出生 五行缺水火 望高人帮忙起名... 女孩,姓陆,2010.农历05.19下午13.25分出生。五行不缺。请各位大虾取个... 2013年女孩3月9号11点43姓陆女孩取什么名字 2012年11月11日上午5点左右出生的女孩五行缺什么,姓陆,取什么名好 女孩2013年4月4日清明节晚上二十三点半左右出生想知道五行缺?啥取什... 公对公汇款需要什么资料 在微信附近的人里面我点击了清除位置并退出的按钮这样别人在附近的人... 13点128保留整数是多少 128乘以72怎么估算 按要求把下面各数省略万位(或亿位)后面的尾数,求出近似数.1284639... 列举国内关于网络著作权侵犯的系列典型案例 梦见已故的母亲用烟囱管往自己身上埋? 求头像!这个头像是哪部漫画里面的,名字叫什么,想要高清头像! 动漫女生头像。冷酷的,不要萌的,最好是正面,侧面也行。要高清的。最好长发,什么颜色头发都行,但坚决 工作组怎么无法访问?windows防火墙也打不开了。 你好 由于防火墙起不来 报170错误,在MMC中添加 路由和远程访问 却提示无法初始化信息单元 你已经解决了吗 什么是文化心理及东西方文化心理有什么不同 由于另一个程序或正在运行的服务可能正在使用网络地址转换组件(Ipnat.sys),Window防火墙无法运行。 中医心理学与西方医学心理学最根本的区别 心理学:中西方文化心理差异 买二手房先不过户,只做公证是否可以?风险大吗? 为什么对项目管理感兴趣 蛮子带什么符文 我卖房,对方不过户,只公证,有风险吗? 我,为什么要学项目管理 为什么工科类专业需要学习工程经济与项目管理相关课程? 房屋买卖只公正不过户可以吗,有什么风险? 房产证不过户公证合同有效吗 房子可以公证不过户吗 为什么需要项目管理及如何学习项目管理 知识产权法案例-腾讯与淘宝网有关著作权的纠纷 红旗原则的网络版权现状 我国网络版权纠纷事件为何增长较快? 一道关于著作权的案例 知识产权案例分析(著作权) 谁拉黑了我 怎么看谁把我拉黑了 著作权案例 急! 怎么回事,是谁拉黑了我QQ 知道怎么知道自己被谁拉黑了么? 杳看拉黑我的人是谁 梦见自己死去父母家烟囱给投大木柴进去,预兆什么? 圣诞歌的英文版歌词 梦见烟囱让夫人拨掉从屋内烟筒着望见天空隔壁人在敲打墙壁有烟土下来打是怎? 关于圣诞歌曲英文版的 梦见死去的老人说被打的合不上眼是什么意思? 股票中sar的数值是多少? 圣诞节英文歌曲.. 圣诞节的英文歌曲!! 番鸭炖玉米好吃吗?