WPF学习问题汇集:
WPF中ItemsSource改变,DataGrid中不更新
需要将ItemsSource先赋值为null
,而后再赋值为新的值。
例如:
gridBeamInfo.ItemsSource = null;
if (beamInfoList.Count==0)
{
beamInfoList = new List<BeamInfo>();
beamInfoList.Add(new BeamInfo("未搜索到...", "无"));
}
gridBeamInfo.ItemsSource = beamInfoList;
WPF中DataGrid
高亮搜索符合项
不应遍历DataGrid的cell来搜索符合项,在设计 UI 控件时,开发者保证它与数据源(例如实现了 ObservableCollection 模板的集合)保持双向绑定(不但绑定内容记录,而且绑定集合的变化)。但是并不提供你去遍历控件的 Items 的机制! 在桌面的控件中,由于大量重复使用控件,因此控件占用的内存是个大问题。所以这类数据绑定控件通常会复用 Item 对应的控件。例如 DataGrid 可能只保持30行子控件,当你的数据有30000行时,另外29970行并不对应任何子控件。当最终用户在界面上上下滚动屏幕区域时,已经离开可见区域的子控件可能会触发一个类似 xxxxxUnload 的事件,随后就被重新用新数据绑定了(而不是销毁了),重新绑定之后就会再触发一个类似 xxxxxLoad 的事件。 也就是说,子控件的自动重用的。如果你遍历这些子控件,你只会得到较少的、绑定数据貌似混乱的结果。因为之后当前可见的那些子控件对象实例才保证绑定的数据是准确的,它们过了瞬间就会绑定到其它数据上! 所以要遍历DataGrid之类的控件所绑定的数据集合,那么就去遍历数据集合。千万不要去遍历其Items控件集合、在通过Item去访问绑定的数据对象,这是不会有稳定的和准确的结果的。
//仅供参考,不建议使用
for (int i = 0; i < gridBeamInfo.Items.Count; i++)
{
string beamName = (gridBeamInfo.Columns[0].GetCellContent(gridBeamInfo.Items[i]) as TextBlock).Text;
if (beamName == searchedBeamName)
{
gridBeamInfo.SelectedIndex = i;
gridBeamInfo.ScrollIntoView(gridBeamInfo.Items[i]);
//gridBeamInfo.Focus();
var searchedEle = beamInfoManager.BeamInfoDict[searchedBeamName];
EbDb.UIViewZoom(EbDb.ActivView2D.GView, searchedEle);
return;
}
}
正解:是通过绑定的数据源,遍历数据源,然后将数据源强制转换为object,调用ScrollIntoView方法和设定SelectedItem属性即可。
for (int i = 0; i < beamInfoList.Count; i++)
{
//var textblock = gridBeamInfo.Columns[0].GetCellContent(gridBeamInfo.Items[i]) as TextBlock; 禁止使用该方法遍历DataGrid控件的cell,会出现访问越界的异常
if (beamInfoList[i].beamName==searchedBeamName)
{
gridBeamInfo.SelectedItem =(object)beamInfoList[i];
gridBeamInfo.ScrollIntoView((object)beamInfoList[i]);
//gridBeamInfo.Focus();
var searchedEle = beamInfoManager.BeamInfoDict[searchedBeamName];
EbDb.UIViewZoom(EbDb.ActivView2D.GView, searchedEle);
return;
}
}
- 高亮被选择的Cell代码是
gridBeamInfo.SelectedIndex = i;
gridBeamInfo.ScrollIntoView(gridBeamInfo.Items[i]);
<Page x:Class="EBPlugIn2.BeamSYPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:EBPlugIn2" xmlns:system="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
d:DesignHeight="800" d:DesignWidth="190" Title="梁编号索引" Unloaded="Page_Unloaded" Loaded="Page_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<TextBox x:Name="searchbox" TextChanged="textbox_TextChanged" Grid.Row="0" Height="26">
<TextBox.Resources>
<VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock FontStyle="Italic" Text="输入编号快速定位" FontSize="12"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Resources>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<DataGrid x:Name="gridBeamInfo" AutoGenerateColumns="False" IsReadOnly="True" Grid.Row="1" SelectionMode="Single" SelectionChanged="gridBeamInfo_SelectionChanged">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="RosyBrown"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="名称" Binding="{Binding beamName}" Width="2*"></DataGridTextColumn>
<DataGridTextColumn Header="数量" Binding="{Binding beamNum}" Width="*"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="2" Content="关闭对话框" Height="26" Click="Button_Click"/>
</Grid>
</Page>
WPF中无法访问到XXX
重新生成dll
WPF学习问题汇集:的更多相关文章
- WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)
时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码) 已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主 ...
- WPF学习05:2D绘图 使用Transform进行控件变形
在WPF学习04:2D绘图 使用Shape绘基本图形中,我们了解了如何绘制基本的图形. 这一次,我们进一步,研究如何将图形变形. 例子 一个三角形,经Transform形成组合图形: XAML代码: ...
- WPF学习之资源-Resources
WPF学习之资源-Resources WPF通过资源来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等,而在其支持上也更能体现出这些资源定义的优越性.比如通过Resour ...
- WPF学习之路初识
WPF学习之路初识 WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...
- WPF学习拾遗(二)TextBlock换行
原文:WPF学习拾遗(二)TextBlock换行 下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧. 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要 ...
- WPF学习(8)数据绑定
说到数据绑定,其实这并不是一个新的玩意儿.了解asp.net的朋友都知道,在asp.net中已经用到了这个概念,例如Repeater等的数据绑定.那么,在WPF中的数据绑定相比较传统的asp.net中 ...
- WPF学习:3.Border & Brush
上一章<WPF学习:2.Layout-Panels-Countainers>主要介绍了布局,容器和面板.这一章主要开始介绍Border(边界)和Brush(画刷). 代码地址:http:/ ...
- wpf学习
http://www.jikexueyuan.com/course/1231_3.html?ss=1 WPF入门教程系列二——Application介绍 http://www.cnblogs.com/ ...
- WPF学习笔记-用Expression Design制作矢量图然后导出为XAML
WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...
- WPF 学习笔记-在WPF下创建托盘图标
原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...
随机推荐
- 获取另一个frame中的元素
<frameset cols="12,88" frameborder="no" noresize borders="no" frame ...
- surpac 中如何删除点
找到显示的编号 输入线窜线段编号
- ascci 码表
- k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused
前言 在搭建好 kubernetes 环境后,master 节点拥有 control-plane 权限,可以正常使用 kubectl. 但其他 node 节点无法使用 kubectl 命令,即使同步过 ...
- [每日算法 - 华为机试] leetcode20 :有效的括号 「栈」
入口 力扣https://leetcode.cn/problems/valid-parentheses/submissions/ 题目描述 给定一个只包括 '(',')','{','}','[','] ...
- 【Java】常用类
一.String类 java.lang.String类的使用 注意:String可以String s = "";,是因为String类型在后面自动补充了'\0' char初始化不能 ...
- .ocx注册失败以及IE使用获取不到.ocx方法的解决办法
小伙伴写了个.ocx给我,来实现在IE里用<object>获取,并用js调用.ocx的方法去控制XX硬件 Error[1],.ocx注册失败,提示如下: 解决[1]如下: 首先需要下载个工 ...
- leetcode每日一题:使字符串平衡的最小交换次数
引言 今天开始,打算做一个新的系列:leetcode每日一题的题解.预期每天用90分钟的时间,去写一篇当天的每日一题的题解,这个目标跟早起结合在一起,才有足够的时间完成.其实早在前几年,就开始断断 ...
- TMS WEB Core的DEMO
TMS WEB Core的思路就是把你界面设计转换成js.这个打通了,将会使生产效率呈几何级数提高. 说如何让其demo的能跑起来: 1.看图.增加参数(TMSHttpConfig.exe). 2.运 ...
- study Rust-1【Rust的特点和应用场景】
Rust语言的特点 高性能 - Rust 速度惊人且内存利用率极高.由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成. 可靠性 - Rust ...