问题:WPF中DataGrid需要动态生成列并绑定值,首列包含图片和文本,点击图片触发事件。

难点:1.图片资源在VisualTree中的绑定

     2.图片的事件绑定

 public class MainScreenViewModel : CpScreen
{ public event MouseButtonEventHandler imageMouseDown; protected override void OnInitialize()
{
base.OnInitialize();
imageMouseDown += new MouseButtonEventHandler(ImageMouseDown);
} public void BtnQuery()
{
var view = this.GetView() as MainScreenView; //MVVM
if (view == null)
return; List<DynamicModel> modelList = new List<DynamicModel>(); BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri("/Wilmar.Base.UI;Component/Resources/Icons/master_delete.gif", UriKind.RelativeOrAbsolute);
bitmap.EndInit(); for (int i = ; i < ; i++)
{
dynamic model = new DynamicModel();
model.WardDesc = "病区" + i;
model.ImagePath = bitmap; modelList.Add(model);
} FrameworkElementFactory imgFactory = new FrameworkElementFactory(typeof(Image)); Binding imgBind = new Binding("ImagePath");
imgBind.Mode = BindingMode.TwoWay;
imgFactory.SetValue(Image.SourceProperty, imgBind);
imgFactory.SetValue(Image.TagProperty, new Binding(".")); //Tag,标记当前行绑定对象
imgFactory.AddHandler(Image.MouseDownEvent, this.imageMouseDown); FrameworkElementFactory textFactory = new FrameworkElementFactory(typeof(TextBlock));
textFactory.SetValue(TextBlock.TextProperty, new Binding("WardDesc")); FrameworkElementFactory contentFactory = new FrameworkElementFactory(typeof(StackPanel));
contentFactory.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
contentFactory.AppendChild(imgFactory);
contentFactory.AppendChild(textFactory); DataTemplate dt = new DataTemplate();
dt.VisualTree = contentFactory; DataGridTemplateColumn colWardDesc = new DataGridTemplateColumn();
colWardDesc.CellTemplate = dt; view.dgdStatistics.Columns.Add(colWardDesc); view.dgdStatistics.ItemsSource = modelList;
} /// <summary>
/// 切换图片,使用Tag标记的对象来对比图片地址
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ImageMouseDown(object sender, RoutedEventArgs e)
{
var control = sender as Image;
if (control == null)
return;
var model = control.Tag as DynamicModel;
if (model == null)
return; if (model.Properties["ImagePath"].ToString() == "/Wilmar.Base.UI;Component/Resources/Icons/master_delete.gif")
{
model.Properties["ImagePath"] = "/Wilmar.Base.UI;Component/Resources/Icons/master_add.gif";
BitmapImage newImg = new BitmapImage(new Uri("/Wilmar.Base.UI;Component/Resources/Icons/master_add.gif", UriKind.RelativeOrAbsolute));
control.Source = newImg;
}
else
{
model.Properties["ImagePath"] = "/Wilmar.Base.UI;Component/Resources/Icons/master_delete.gif";
BitmapImage newImg = new BitmapImage(new Uri("/Wilmar.Base.UI;Component/Resources/Icons/master_delete.gif", UriKind.RelativeOrAbsolute));
control.Source = newImg;
}
}
}

动态属性类:

 public class DynamicModel : DynamicObject
{
public Dictionary<string, object> Properties = new Dictionary<string, object>(); public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (!Properties.Keys.Contains(binder.Name))
{
if (binder.Name == "Col")
Properties.Add(binder.Name + (Properties.Count), value.ToString());
else
Properties.Add(binder.Name, value.ToString());
}
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return Properties.TryGetValue(binder.Name, out result);
}
}

效果图:

参考:http://stackoverflow.com/questions/1951839/how-do-i-show-image-in-wpf-datagrid-column-programmatically

原文地址:http://www.cnblogs.com/maomiyouai/p/3608468.html

WPF CodeBehind后台动态创建图片及添加事件的更多相关文章

  1. 如何给js动态创建的dom添加事件

    delegate() 方法 实例 当点击鼠标时,隐藏或显示 p 元素: $("div").delegate("button","click" ...

  2. 使用addeventlistener为js动态创建的元素添加事件监听

    点击li弹出内容,并且动态添加li之后有效 <button onclick="addFunction()">点我增加</button> <ul> ...

  3. ndroid动态创建按钮并添加事件

    public class MyActivity extends Activity { /** * Called when the activity is first created. */ @Over ...

  4. WPF 中,动态创建Button,并使Button得样式按照自定义的Resource样式显示

    第一步:自定义一个Button的样式 1.新建一个xaml文件,在其中自定义好自己的Resources 这个Resource 的根节点是 <ResourceDictionary xmlns=&q ...

  5. 给js动态创建的对象绑定事件

    1.使用原生JS动态为动态创建的对象绑定事件 1-1.创建一个function,用来兼容IE8以下浏览器添加事件 function addEvent(el, type, fn) {  if(el.ad ...

  6. iOS中动态注入JavaScript方法。动态给html标签添加事件

    项目中有这样一种需求,给html5网页中图片添加点击事件,并且弹出弹出点击的对应的图片,并且可以保持图片到本地 应对这样的需求你可能会想到很多方法来实现. 1. 最简单的方法就是在html5中添加图片 ...

  7. jquery动态生成的元素添加事件的方法

    动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...

  8. siverlight 后台动态设置图片路径的总结

    最近碰到了个问题,需要给一个用户控件中的image动态设置图片资源 1.图片资源属性为resource时,静态引用无任何问题,但是动态设置时,就什么也不显示 后来找到问题所在, 必须把此图片属性项中“ ...

  9. repeater中后台动态为控件添加属性

    在此贴出repeater中的ItemDataBound事件中的代码: private void ItemDataBound(object sender, RepeaterItemEventArgs e ...

随机推荐

  1. .Net Framework认知

    在托管代码的世界里,应用程序首先被加载到应用程序域(AppDomain)中,然后将应用程序域加载到进程中,一个进程可以包含多个应用程序域,也就是说一个进程可以包含多个应用程序,毕竟应用程序域之间的切换 ...

  2. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  3. mac 关闭&&显示隐藏文件命令

    打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件 defaults write com.a ...

  4. PHP 文件夹操作「复制、删除、查看大小」递归实现

    PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动 ...

  5. html5——canva 绘图1简单图形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. js_闭包

    先从闭包特点解释,应该更好理解.闭包的两个特点:1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区.其实上面两点可以合成一点,就 ...

  7. SqlPlus中退格键和方向键的设置

    参见:http://www.cnblogs.com/wjx515/p/3717986.html   http://blog.csdn.net/jacky0922/article/details/765 ...

  8. lvs+keepalived

    一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2.6.32-279.el6.i686 LVS版本:ipvsadm-1.26 keepalive ...

  9. SQL添加维护 计划失败

    在sql要求数据库每天自动备份这个是大家都会遇到的问题,我遇到了这个问题如图: 是因为这个服务组件没有安装

  10. 微信后台开发第一步:nodeJS+express接入微信后台详细教程

    博文由  水车  编写 欢迎各位指正,转载请把链接带上——http://www.cnblogs.com/xuange306/p/4971702.html 前期准备工作 1:如果你没有服务器,那你需要一 ...