WPF学习问题汇集:

摘要:
WPF中ItemsSource改变,DataGrid中不更新需要将ItemsSource先赋值为null,而后再赋值为新的值。在桌面的控件中,由于大量重复使用控件,因此控件占用的内存是个大问题。例如DataGrid可能只保持30行子控件,当你的数据有30000行时,另外29970行并不对应任何子控件。也就是说,子控件的自动重用的。千万不要去遍历其Items控件集合、在通过Item去访问绑定的数据对象,这是不会有稳定的和准确的结果的。

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: 
             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  />
            <RowDefinition  />
            <RowDefinition  />
        </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="关闭对话框"   Click="Button_Click"/>
    </Grid>

</Page>

WPF中无法访问到XXX

重新生成dll

免责声明:文章转载自《WPF学习问题汇集:》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#如何优雅地取消一个流程(非Thread.Abort方法)前端小白之每天学习记录----js简单的组件封装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF 快捷键(窗体)

前言:在WPF项目开发当中,遇到了需要用到快捷键的需求,于是对热键做了一个快速学习,但是这方面的资源很少。。。 热键大致分为三种场景,下面用QQ的使用场景举例: 全局热键:QQ的Ctrl+Alt+A截图。 焦点热键:QQ消息栏的Shift+Enter文本换行。 窗体热键:Alt+F4关闭QQ的窗口。 在WPF当中,全局热键 和 焦点热键都可以轻松实现,下...

wpf研究之道——datagrid控件数据绑定

前台: <DataGrid x:Name="TestCaseDataGrid" ItemsSource="{Binding}" > {binding} 是个简写的方式,绑定的是datagrid 对象的DataContext 后台: this.TestCaseDataGrid.DataContext = Data.PagerSource;...

wpf 中 Ellipse 对象对动画性能的影响

vs2019 .NetFramework 4.8 win10-64 1909   接手一个wpf项目,某窗口中包含大量的 Shape 对象(线,矩形,圆形等). 这些内容要匀速的向左平移,类似于游戏"太鼓达人". 方案是使用 CompositionTarget.Rendering 在每帧中设置内容的 TranslateTransform.X 问题是匀速平移...

WPF入门教程系列一——基础

WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列六——布局介绍与Canvas(一) WPF入门教程系列七——布局之WrapPanel与StackPanel(二)...

Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeSet进行学习。我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet。内容包括:第1部分 TreeSet介绍第2部分 TreeSet数据结构第3部分 TreeSet源码解析(基于JDK1.6.0_45)第4部分 TreeSet遍历方式第5部分 TreeSet示例 转载请注明出处:http...

继续聊WPF——自定义命令

作为春节前的最后一篇技术文章,写点什么呢?想了一下,就聊聊WPF中的命令吧。 命令这东西很有意思,简明一点说,它是一种逻辑,但这种逻辑可以被多种源调用,可以作用于多种目标上。如我们常见的“复制”,“剪切”等命令,它们本身就是一种逻辑——对剪切板进行操作的逻辑行为,不过,你会发现,它们不仅可以在菜单项中使用,也可以在工具栏按钮上使用,也可以通过快捷键Ctrl...