Tag: datatemplateselector

使用WPF动态加载内容

好的,我有一个容器,我已经创建了两个数据模板。 基本上,一个模板将显示5个文本框,并且对象数据绑定到它们,另一个模板将显示添加该特定对象的按钮。 我将DataTemplateSelector子类化并且它可以工作,但是当我浏览我的记录时,Selector永远不会被再次调用。 那么我将如何让容器重新选择它的模板。 容器是StackPanel,我已经尝试过UpdateVisuals,InvalidateVisuals,InvalidateArrange和ApplyTemplate。 XAML代码 在Group Box上更改内容的初始化 grpAdv.ContentTemplateSelector = _advisorSelector; 最后是选择器代码 private readonly StudentWin _win; public AdvisorDataTemplateSelector(StudentWin win) { _win = win; } public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { var sp = item as StackPanel; var adv = sp.DataContext as Advisor; if (adv == null) return _win.FindResource(“addAdvisor”) as DataTemplate; return _win.FindResource(“advisorTemplate”) as […]

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中为相同的数据类型使用不同的数据模板,我不能这样做:-)请帮忙吗?

当从DataTemplateSelector显式返回DataTemplate时,为什么DataTemplate不能绑定到接口?

我创建了一个DataTemplateSelector,它使用已知接口的集合进行初始化。 如果传入选择器的项目实现其中一个接口,则返回关联的数据模板。 首先,这是有问题的ICategory接口…… public interface ICategory { ICategory ParentCategory { get; set; } string Name { get; set; } ICategoryCollection Subcategories { get; } } 这是基于基类或接口而不仅仅是特定具体类匹配的DataTemplateSelector … [ContentProperty(“BaseTypeMappings”)] public class SubclassedTypeTemplateSelector : DataTemplateSelector { private delegate object TryFindResourceDelegate(object key); public override DataTemplate SelectTemplate(object item, DependencyObject container) { var frameworkElement = container as FrameworkElement; foreach(var baseTypeMapping […]

在运行时组合DataTemplates

我有一个ListBox,它通过ItemSource呈现对象的数据绑定列表。 因为每个对象都有特殊的显示需求,所以我定义了一个ItemTemplateSelector,它根据对象返回相应的DataTemplate。 这一切都顺利进行。 每个对象的DataTemplates遵循一个通用公式,但在中间包含自定义元素。 例如: 正如你所看到的那样,有很多共享的XAML,在中间包含一个小的自定义部分。 其他数据模板将由其他工程师编写(他们希望为他们添加的每个新对象类型创建一个),因此我有兴趣创建一个新的DataTemplate,尽可能简单,无痛。 当然,没有复制整个DataTemplate与中间添加的自定义“东西” – 但我也不会偏向于将模板的一部分提取为可重用的部分并引用它们,因为它仍会导致大量重复的代码每个新的DataTemplate,这意味着可能的错误和难以维护。 也就是说,这是一种更易于维护的方法,但仍然感觉不是最理想的: […] 那么:解决这个问题的最佳策略是什么? AFAIK我坚持使用DataTemplates,因为这是ListBox ItemTemplateSelector接受的唯一元素。 有没有办法在DataTemplateSelector中创建复合DataTemplate? 我将提供由所有对象共享的库存DataTemplate,以及每个对象类型所需的自定义XAML位中的DataTemplateSelector引用。 其他工程师会加入这种通用代码行为。 不确定,在这里黑暗中摸索着是否有一种模式可以让我优雅地解决这个问题。 并且,仅供参考:我当前的DataTemplateSelector非常简单。 这是我期望构建最终DataTemplate的地方,而不是简单地返回在XAML中硬编码的那个。 public class NodeComponentDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { FrameworkElement element = container as FrameworkElement; if (element != null && item != null) { if (item is CollectibleComponent) return […]

如何正确引用XAML中的类

好吧,这是一个超级超级菜鸟问题,我几乎不好意思问… 我想在我的XAML文件中引用一个类。 它是一个DataTemplateSelector,用于为DataGrid列选择正确的编辑模板。 无论如何,我已经将类编写到我的代码后面,将本地命名空间添加到XAML顶部的顶部,但是当我尝试从XAML引用该类时,它告诉我该类在本地命名空间中不存在。 我必须遗漏一些非常简单但我无法理解的东西…… 这是我的代码。 XAML: blah blah blah… C#: namespace CustomFields { public partial class MainWindow : Window { public MainWindow() { this.InitializeComponent(); // Insert code required on object creation below this point. } } public class RangeValuesEditTemplateSelector : DataTemplateSelector { public RangeValuesEditTemplateSelector(){ MessageBox.Show(“hello”); } } } 我有什么想法我做错了吗? 我认为这应该很简单,如1-2-3 …… 谢谢!

WPF:当某个值更改时重新应用DataTemplateSelector

所以这是我拥有的XAML: 这是我的ListTemplateSelector类: public class ListTemplateSelector : DataTemplateSelector { public DataTemplate GroupTemplate { get; set; } public DataTemplate ItemTemplate { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { GroupList list = item as GroupList; if (list != null && !list.IsLeaf) return GroupTemplate; return ItemTemplate; } } GroupTemplate数据模板本身引用了ListTemplateSelector,所以这就是我设置的原因。 这是我可以放在一起的唯一递归黑客。 但那不是我遇到的问题。 我的问题是,我想在IsLeaf属性更改时从ItemTemplate更改为GroupTemplate。 这是第一次读取房产以来的第一次。 但是一旦此属性更改,模板选择器就不会重新应用。 现在,我可以使用触发器绑定到值并适当地设置项模板,但我需要能够为每个项设置不同的模板,因为它们可能处于不同的状态。 […]