Tag: datatemplate

为什么DataTemplate.LoadContent()不尊重模板定义的触发器?

TL-DR版本: 我们试图找出触发器生效的DataTemplate的自动应用与手动调用触发器无效的DataTemplate.LoadContent()之间的区别。 现在细节…… 但首先,我首先要说的是,这个问题是为了帮助我们理解框架及其在内部所做的工作,因此,相关代码严格来说明问题本身,并不代表我们的实际代码。 正如他们所说,它仅用于说明目的。 (只是试图避免不可避免的’我不明白你想要做什么’或’那不是我会怎么做’的回应。再一次,它只是为了支持这个问题。希望这是有道理的。) 也就是说,考虑这个XAML定义一个String的DataTemplate有两个触发器(每个触发器都针对不同的元素)…… xmlns:system=”clr-namespace:System;assembly=mscorlib” … 然后在XAML中该模板在范围内的另一个位置,我们有… ……按预期工作。 在代码中,我们可以像这样访问扩展模板(Border)的根元素… var expandedTemplateRootElement = VisualTreeHelper.GetChild(TestPresenter, 0) as FrameworkElement; ……但触发器的应用方式和位置如何? 它们显然有效,但expandTemplateRootElement.Triggers.Count和TestPresenter.Triggers.Count都返回零。 正如问题标题中所述,如果我们尝试手动扩展DataTemplate中的内容,就像这样…… var rawContents = “Show me the money!”; var dataTemplateToUse = TestPresenter.FindResource(new DataTemplateKey(rawContents.GetType())); var expandedTemplateRootElement = dataTemplateToUse.LoadContent() as FrameworkElement; expandedTemplateRootElement.DataContext = rawContents; SomeOtherPresenter.Contents = expandedTemplateRootElement; …虽然这确实在第二个ContentPresenter中显示了Border和TextBlock(在这里称为SomeOtherPresenter),而dataTemplateToUse.Triggers 确实显示了两个已定义,但它们不起作用! 我想知道 a)为什么不,和 b)如何启用/应用它们。 当然,“作弊”只是简单地启动新的ContentPresenter,设置其内容,然后将其ContentTemplate设置为相关的DataTemplate。 然后你可以把整个东西塞进另一个ContentPresenter中,让框架担心细节,比如这…… var rawContents […]

使用数据绑定处理样式

重写 我有一个接收文件的应用程序。 此文件包含大量可编辑内容。 此内容有多种可能的类型(即布尔复选框,文本框等)。 问题是,这些值可以是单独的,也可以是一个组(最多8个),因此它们可以是数组。 我们将这些值绑定到ListView ,并使用DataTemplates显示它们。 实际上,我从数组列表中创建了ListView 。 这些数组中的项需要是数据绑定和正确设置样式(例如,布尔数组需要创建复选框,而字符串数组需要文本框)。 每个创建的元素都需要放入ListView的列中。 当前样式使用DataTemplates与数据绑定,即 对输入数组中的每个值重复此操作,因此您有Value[1] , Value[2]等。 这意味着重复几乎相同的代码8次,然后对下一种类型执行相同的操作。 由于存在大量输入类型,这意味着重复代码的数量是荒谬的。 我的问题是: 有没有更好的方法来做到这一点,所以我们不必重复数据模板,同时继续使用列? 顺便说一句,我使用的是.NET 3.5。 行如何显示的示例。 每个元素都在自己的列中。 combobox是从arrays构建的。 编辑示例DataTemplate: 示例图: 我有一个ViewModel。 此ViewModel具有List,由ItemData组成。 ItemDataData有一个名为Values的数组。 List已绑定到View。 我们需要根据我们访问的ItemData的属性选择要使用的DataTemplate: 一个名字 选项arrray中的一个或多个。 目前,我们在ListView中显示List。 生成ListView ,列具有附加到其CellTemplate的不同DataTemplates ,每个索引一个,总共8个DataTemplates。

自定义TabItem DataTemplate

如何在WPF中为TabItems创建DataTemplate,并在每个TabItem中自定义其内容? 我需要这个: … 但按钮未显示(仅显示DataTemplate的内容)。

抑制GridViewColumn上的鼠标hover效果

我有一个带有HeaderTemplate的GridViewColumn ,它有一个Image和一个TextBlock 。 当用户将鼠标hover在Image我正在更改其不透明度,但我仍然会获得默认的标题鼠标效果。 当用户将鼠标hover在图像上时,如何抑制此效果?

过滤使用嵌套的xaml数据模板显示的分层对象

我无法过滤嵌套的xaml模板中显示的分层数据。 我有一个ObservableCollection Foos ,我在XAML中显示。 让我们说Foo看起来像: class Foo { public ObservableCollection Bars; } class Bar { public ObservableCollection Quxes; } 我正在使用以下xaml显示Foos: 换句话说,有一个标签控件,每个Foo都有一个标签。 每个Foo都是一个选项卡控件,每个Bar都包含在它自己的选项卡中。 每个Bar都包含其Quxes的列表框。 要么: ______ ______ ______ | Foo1 | Foo2 | Foo3 | |______ ______ | | Bar1 | Bar2 |______| | | qux1 || | | qux2 || | | qux3 || ———————- […]

如何在multibinding中获取父值

我正在使用dataTemplate 。 这是模板: 你能看到这条线吗? 该行抛出exception,应该是因为RAM.Size来自父元素。 我怎么能得到那个价值? 提前致谢!

为什么DataBinding没有传播到UserControl

今天早上我在这里问了一个问题,做一个简单的工作样本给了我一个不同于预期的行为。 GitHub上的完整工作样本。 主要部分代码如下。 在本例中,如果UserControl直接用作Window的子节点,则命令永远不会传播到任何UserControl。 如果UserControl用作ListBox ItemTemplate的DataTemplate,它也不起作用。 我还包括一个黑客按钮来修复Command到达UserControls的问题。 黑客来自StackOverflow 。 但是使用hack并不能解释为什么UserControl没有收到Command(没有它)并且使用这个hack也打破了良好编码的第一条规则:“Hi cohesion and Low coupling”。 应该在窗口代码中使用hack来管理UserControl中的Command,我的想法是它应该默认发生。 为什么命令没有默认传播到UserControl,我该怎么做才能以干净的方式将命令传播给UserControl? 注意:在UserControl中仅使用一个CommandBinding(删除一个或另一个)不能解决问题。 部分代码: 1 2 Put focus on TestBlock and click here to see if command occurs Hack 用户控件:

DataTemplate for DataType – 如何在特定的ListBox中覆盖此DataTemplate?

我已经为我的宠物项目中的一些DataType创建了几个DataTemplates。 这些数据模板非常酷,因为它们像魔术一样工作,无论何时何地在UI中显示,都可以神奇地转换数据类型实例的外观。 现在我希望能够在一个特定的ListBox中更改这些DataType的DataTemplate。 这是否意味着我必须停止依赖WPF自动将数据模板应用于数据类型并将ax:Key指定给DataTemplates,然后使用该键在UI中应用Template / ItemTemplate? ListBox包含各种数据类型的项目(所有数据类型都来自公共基类),现在,所有这些项目都可以在不指定TemplateSelector的情况下神奇地工作,因为正确的模板是由listBox中项目的实际数据类型选择的。 如果我使用x:Key来应用DataTemplates,那么我是否需要编写TemplateSelector? 我是新手,只是试验DataTemplates。 我想,哇,有多酷! 然后我想在不同的列表框和ooops中为相同的数据类型使用不同的数据模板,我不能这样做:-)请帮忙吗?

在c#代码隐藏中进行数据模板化

我搜索一个选项,用c#代码构建一个datatemplate。 我用过: DataTemplate dt = new DataTemplate(typeof(TextBox)); Binding bind = new Binding(); bind.Path = new PropertyPath(“Text”); bind.Mode = BindingMode.TwoWay; FrameworkElementFactory txtElement = new FrameworkElementFactory(typeof(TextBox)); txtElement.SetBinding(TextBox.TextProperty, bind); txtElement.SetValue(TextBox.TextProperty, “test”); dt.VisualTree = txtElement; textBox1.Resources.Add(dt, null); 但它不起作用(它被放置在窗口的Loaded-Method中 – 所以我的文本框应该在窗口开始时显示“test”一词)。 任何的想法?

在WPF中validationPasswordBox

有没有办法在validationPasswordBox时在AdornedElementPlaceholder中显示错误消息。 我有这样的事情: 和我的BaseControlStyle我使用该validation 它的工作就像一个几乎所有控件(Combobox,DateTimePicker,TextBox)的魅力,但是当我想为passwordBox使用相同的样式时,它不起作用。 在图片中,您可以看到它与simpe TextBox一起使用但不与PasswordBox一起使用。 我不知道如何提取错误消息以在工具提示中显示它AdornedElementPlaceholder 它显示Username属性的错误消息 [Required(ErrorMessage = “Please enter username.”)] 我不想用passwordBox实现同样的function,以便在输入密码时向用户提供有关错误(约束)的反馈 任何帮助都非常感谢。 提前致谢 :) 编辑: 我用它来做密码属性 [Required(ErrorMessage = “Please enter password.”)] [RegularExpression(@”^.*(?=.{8,})(?=.*\d)(?=.*[az])(?=.*[AZ])(?=.*[^a-zA-Z0-9]).*$”)] [StringLength(maximumLength: 15, ErrorMessage = “Minimum 8 and maximum 15 characters.”, MinimumLength = 8)] public string Password { get { return GetValue(); } set { SetValue(value); } } 并使用PasswordBoxAssistant绑定到该属性 并使自定义PasswordBoxStyle为BasedOn ControlBaseStyle […]