本文记录一个 WPF 已知问题,在 ObservableCollection 的 CollectionChanged 事件里面,绕过 ObservableCollection 的异常判断逻辑,强行修改集合内容..._changed 字段只是让代码不会多次进入而已,因为添加元素也会触发集合变更事件,如果在集合变更事件里面再次添加元素,那就无限进入集合变更 可以看到界面显示符合预期 第二个方法是强行刷 ItemsSource...= null; ListBox.ItemsSource = List; } 抛出的异常代码如下 System.InvalidOperationException:“某个 ItemsControl...Exception: 针对开发人员的信息(使用文本可视化工具来阅读此内容): 引发此异常的原因是名为“ListBox”的控件“System.Windows.Controls.ListBox Items.Count...:3”的生成器已接收到一个 CollectionChanged 事件序列,这些事件与 Items 集合的当前状态不符。
} 原理:监听事件机制,界面改变有TextChanged之类的事件,所以改变界面可以同步修改到对象 想让普通对象实现数据绑定,需要实现INotifyPropertyChanged接口才能监听ProperChanged...TwoWay 当源属性变化时更新目标属性,当目标属性变化时更新源属性 OneTime 最初根据源属性设置目标属性,其后的改变会忽略。...LostFocus 控件失去焦点的时候更新源值 PropertyChanged 绑定的目标值改变时更新。 实例运行后界面如下: ?...是一个非常糟糕的主意。....ItemsSource = stuList; this.listBox2.ItemsSource = stuList; this.listBox2.DisplayMemberPath
DockPanel它自身有一个非常重要的bool值属性:LastChildFill,当这个属性为True时,最后一个添加在该布局控件中的控件会自动填满剩余空间,即使为其赋了DockPanel.Dock值...WarpPanel:这个布局跟StackPanel很相像,它是流式布局,同样是使用Orientation属性来控制子控件的排列,但是比StackPanel更强大的功能是当控件不能在一行或者一列排开时,它会自另起一行或一列..., 列表项控件 Menu:这个控件专用于菜单项的显示,使用其属性ItemsSource绑定后台一个集合或数组,或者使用MenuItem以硬编码的形式来填充一个个菜单项,MenuItem的Header...属性用来控制菜单项的显示文字,该控件除了有click这样的一般事件外,还有用于响应选中的Checked和Unchecked事件,以及控制选中事件是否执行的IsCheckable的属性(该属性默认为False...="True"/> DataGrid控件 这个控件就是一个表格,跟数据库中的表是类似的,并且它的职责就是用来显示数据库中的数据,下面先看个实例代码: <DataGrid
Binding源的对象具有自动通知Binding属性已改变的能力,就需要让类实现InotifyPropertyChanged接口并在熟悉的set语句中激发PropertyChanged事件。...其实,“Binding沿着UI元素树网上找”只是WPF给我们的一个错觉,实际是因为DataContext是一个“依赖属性”,当控件的依赖属性没有显式赋值时,依赖属性值会沿UI元素树向下传递。 ...DataContext的用法: *当UI上多个控件Binding同一个对象时 *当Source对象不能被直接访问时——比如B窗体内的控件想把A窗体内的控件当做Binding源,但A窗体内的控件是...6.3.12 使用Binding的RelativeSource 当一个Binding有明确的数据来源时,我们可以通过为Source或ElementName赋值的办法进行Binding 有时候我们不确定...以Slider为源,TextBox为目标 当TextBox输入超出范围时,边框会显示为红色 Binding默认只校验Target->Source,不校验Source->Target的数据,如果想校验需要设置
常用的数据绑定控件有文本框(TextBox)、标签(Label)、列表框(ListBox)、组合框(ComboBox)、数据表格(DataGridView)等。...当数据源发生改变时重新绑定数据源,初始化数据。...下面有一个例子,我们可以看到,初始化界面的时候,数据绑定了一次(mygard.ItemsSource),当点击按钮的时候,itemsource的值就发生改变了,这个是为什么呢?...在许多情况下,您使用的数据是对象的集合。 例如,数据绑定中的常见方案是使用 ListBox、ListView或 TreeView 等 ItemsControl 来显示记录集合。...此接口公开 CollectionChanged 事件,即每当基础集合发生更改时应引发的事件。
所以再ObservableCollection这个类的方法,对数据的操作很少,重点放在了当自己本事变化的时候(不管是属性,还是集合)会调用发出通知的事件。...Text="{Binding Name}" /> <ListBox x:Name=...表示当集合对象的集合改变时,只有ObservableCollection会发出通知更新UI。 这只是他们两个区别之一。...OperateDataSheetViewModel.cs::AdvancedSearchFunc()高级查询失败--" + ex.Message); } } 四、总结 1、ObservableCollection表示一个动态数据集合...,在添加项、移除项或刷新整个列表时,此集合将提供通知。
Execute是命令的关键,当被调用时,它将触发命令的执行。 要定义一个新命令,可以实现ICommand接口。...通过使用单一的名称为所需的语义动作签名,在尝试把多个控件和单个事件处理过程挂接起来的时候,可以避免很多由此引发的紧耦合问题。通常,应用程序逻辑应该总是通过命令的方式来实现的,而不是事件处理程序。...对于很多需要直接挂接到事件处理过程上的常见例子,用触发器来处理更好。 命令与数据绑定 使用命令的一个令人振奋和强大的特性 就是和数据绑定集成。...由于Command和CommandParameter都是元素上的属性,所以他们都能被设置为一些绑定到他们的数据。因此,可以使用绑定的数据内容来确定应该发生的动作。 ...首先,定义一个显示内容的ListBox,和一个显示了每个文件名的数据模板,代码如下: <ListBox.ItemTemplate
例子实现的需求是这样的:有一列怪兽数据,这列数据显示在一个ListBox里,要求ListBox的条目显示怪兽的图标和简要参数,单击某个条目后在窗体的详细内容区域显示怪兽的照片和详细参数。...这个UserControl由一个Monster类型实例在背后支持,当设置这个实例的时候,界面元素将实例的属性值显示在各个控件里。...下图说明目前的事件驱动模式与期望中数据驱动界面模式的不同: ~~~~ 事件驱动站在程序员的角度来看,就是用户操作控件(在控件上输入数据),然后控件会产生事件(触发事件处理器来...ItemTemplate=“{StaticResource monsterListItemTemplate}”,是把一件数据的外衣交给ListBox,当ListBox.ItemSource被赋值时,ListBox...不知大家还是否记得,当为一个Binding只指定Path不指定Source时,Binding会沿着逻辑树一直向上找、查看每个节点的DataContext属性,如果DataContext引用的对象具有Path
如果ItemsControl的Items内容不是对应的子元素控件,ItemsControl会创建对应的子元素控件作为容器再把Item放进去。...例如这段XAML中,Item1和Item2是ListBox的LogicalChildren,而它们会被ListBox封装到ListBoxItem,ListBoxItem才是ListBox的VisualChildren...中需要提供一个ItemsPresenter,用于指定ItemsControl中的各Item摆放的位置。...LabelMemberPath和LabelMemberTemplate Repeater动态地创建一个内容为TextBlock的DataTemplate,这个TextBlock的Text绑定到LabelMemberPath...,当Repeater的LabelMemberPath改变时,Repeater首先强制更新了LabelMemberTemplate,然后用ItemContainerGenerator.ContainerFromIndex
输出 2、RelativeSource 绑定 RelativeSource是一个属性,它用相对关系设置绑定源以绑定目标。此扩展主要用于必须将元素的一个属性绑定到同一元素的另一个属性时。...,宽度也会相对变化。...2.2 FindAncestor 顾名思义,当绑定源是绑定目标的祖先(父级)之一时使用此选项。使用FindAncestor扩展,可以找到任何级别的祖先。 让我们举个例子来更清楚地理解它。...输出 2.4 PreviousData 这是相对使用最少的方式。当数据被分析时,这就出现了,我们需要表示值相对于以前数据的变化。 让我们举个例子来更详细地理解它。... 输出 现在,当列表中的项被选中时,它显示属性
如何让列表的内容更容易查找 ? 假设有这么一个列表(数据源在本地),由于内容太多,要查找到其中某个想要的数据会比较困难。要优化这个列表,无非就是排序、筛选和高亮。 ? 改造过的结果如上。 2....如果Source实现INotifyCollectionChanged接口,所做的更改引起CollectionChanged事件传播到View。...= null) _viewSource.View.Refresh(); } 这段代码实现了当输入框的文字改变时刷新View的功能。...> UWP的高亮可以使用TextHighlighter这个类,实现起来很简单。...也可以参考SearchableTextBlock写一个高亮的文本框,一了百了,但我希望通过这个有趣的功能多介绍几种知识。 6.
典型的,把模板关联到一块特定的数据上,不过通常希望动态的确定使用哪个模板---既可以基于一个属性值,也可以是一个全局状态。...DataTemplateSelector提供了一个单一的方法----SelectTemplate,以允许通过执行任何逻辑来决定使用哪个模板。...可以在被包含的元素中查找模板,并返回一些硬编码的模板,甚至动态的为每个条目创建模板。 首先,创建一个继承自DataTemplateSelector的类,并完成一些在几个模板中进行旋转的逻辑。...ListBox进行关联,而不是设置静态模板,代码如下: <
RoutedEventArgs e) { this.TestClass.Test = "456"; } } } 运行后,点击按钮,发现textbox1中的内容并无变化...PropertyChangedEventArgs("Test")); } } get { return _test; } } } 再次运行,发现点击按钮后,textbox1的内容变成了...,都是将数据原封不动的绑定并显示,如果我们希望在绑定时,能对数据的输出做一些变化,比如:代表性别的"1,0"输出时希望变成"男,女",该怎么办呢?...我们可以利用这个玩点小花样,比如界面上有三个矩形,其中"矩形2的宽度"等于"矩形1的宽度"+"一个任意指定的固定值",矩形3的宽度矩形1与矩形2的宽度总和,不允用 rect2.width = rect1...不是更简单吗? 存在即合理,这样的好处是不必用硬编码把逻辑写死,我们可以把常用的转换处理抽象出来,比如封装成一个单纯的dll程序集,以后需要用到的地方,直接引用就可以了,能有效的重用代码。
ListBox是一个很有用的控件,其功能直逼Asp.Net中的Repeater,它能实现自定义数据项模板,纵向/横向排列Item(如果扩展一下实现自行折行,几乎就是SL版的Repeater了--实际上WrapPanel...-2-beta-1-s-listbox-and-scrollviewer-controls.aspx 基本上ListBox的各种用法和注意点都在里面了(E文的,只看代码就行了) 另外关于Style,这个东西刚开始学习时...在学习Style的过程中,经常会遇到另外一个概念:模板(Template),初期经常被他们搞混淆,其实这二者有明显的区别:Style影响外观,而Template影响内容,它们之间通过绑定联系起来(它们之间的联系也可以这样理解...:如果不进行数据绑定,即使定义了模板,最终也不会有内容,既然连内容都没有了,所以也谈不上外观--即所谓的数据驱动UI) 这里举一个ListBox的例子: Xaml <UserControl xmlns...> 这段代码中,ListBox本身空空如也(除了几个样式和模板的应用),最终的呈现内容和外观,全部在UserControl.Resource
<Window x:Class="WpfApp1.MainWindowBase" x:ClassModifier="public"/> x:Name:一般的,标签都有自己的名字,给一个标签的...x:Key:用于在资源字典中标识一个资源,关于xaml资源会在后期讲到,先看个小例子: ...... 列表项1列表项4 列表项5 x:Static:当想要访问其它命名空间的静态属性时,需要加上此前缀。
本来想的是自己根据ToggleButton作为基础自己在做一个复合控件出来。不过这里做导航的话,ListBox会更加的适合些。...ListBox的样式制作和之前的ToggleButton样式制作大同小异,都是一个原则:各个VisualStateGroup中的视图状态是可以共存的,VisualStateGroup内部的视图状态只能同时出现一个...,尽量不要在多个VisualStateGroup同时改变同一个元素的属性。...下来导航模块“LeftNav”需要从外部加载导航配置文件文件"Nav.xml",将其获得的数据解析并于ListBox做数据绑定。...> 最后需要替换右侧的主体Module了,我研究了Composite的Module模块、了解了Module生命周期。
其它自定义View 三、结语 一、前言 项目中要用到一个数据分页栏,虽然自己没有实现过,但凭经验感觉它和ListBox/ListView有关。...你还可以定义用户单击列标题时响应的事件处理程序。事件处理程序可以执行类似于根据列内容对显示在GridView中的数据进行排序的操作。...下面列表详细讨论了使用GridView进行用户交互的功能: 通过拖放对列重新排序 当光标位于表头上时,用户可以按下鼠标左键,然后将该列拖动到新位置,从而对GridView的列进行重新排序。...当用户拖动表头时,会显示标题的浮动列以及一条显示插入位置的实线。...若你想要修改标题的浮动列样式,可以为GridViewColumnHeader指定一个ControlTemplate,当Role属性设置为Floating时将触发。
AccessViolationException:当发生访问冲突时,应用程序会直接崩溃,无法被捕获。 OutOfMemoryException:当内存不足时,应用程序会直接崩溃,无法被捕获。...以下是一个简单的示例,演示如何在ListBox中进行数据绑定: ...> 在这个示例中,MyData是一个集合对象,绑定到ListBox的ItemsSource属性。...这些方法用于执行命令、检查命令是否可执行以及在命令的可执行状态发生改变时引发事件。...在每个元素上,都可以通过处理事件来对事件进行拦截、修改或者传递给下一级元素。 目标阶段是指事件到达目标元素时的阶段。当事件传递到目标元素时,目标元素会处理该事件。
本文告诉大家在 ListBox 做选择时,多选时 SelectedItem 和 SelectedIndex 的值。...首先写一个界面,两个按钮和一个ListBox ,点击第一个按钮选择多个元素,点击第二个按钮就显示当前的 SelectedItem 和 SelectedIndex ...public MainWindow() { InitializeComponent(); QjdckjpVemnepybg.ItemsSource...,SelectedItem 和 SelectedIndex 都是 2 因为他会显示多选的第一个。...SelectedItems 没有选择元素,那么 SelectedIndex 是 -1 如果这时没有开启多选,那么在 SelectedItem 选中元素时,SelectedItems 只有他选中的。
领取专属 10元无门槛券
手把手带您无忧上云