- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用于 DataGridTemplateColumn 的 DataTemplateSelector。它正确地为我提供了一个 DataTemplate,该模板根据我的 DataRow(在其他列中)中的某些信息而变化。
到目前为止一切顺利。
但是,当我现在更改网格中的数据时,这将导致选择器为该列选择不同的 DataTemplate,它不会自动显示这个新的 DataTemplate。
我在 Matthew MacDonald (Apress) 的 Pro WPF in C# 2008 第 564 页中读到,这是已知问题,唯一的解决方法是释放选择器并重新应用它,当我的表中有很多记录时,这会非常慢.
有人找到解决这个问题的方法吗?或者 .NET4 中可能有一个新功能可以解决这个问题?
谢谢
马塞尔
最佳答案
一种解决方案是将 ContentPresenter 放入单元格内。这样,当内容更改时,ContentPresenter 将再次向选择器请求模板。例如:
<Window
x:Class="TestSAS.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:TestSAS">
<Window.Resources>
<local:MySelector x:Key="mySelector">
<local:MySelector.UpperTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="upper - "></TextBlock>
<TextBlock Text="{Binding}"></TextBlock>
</StackPanel>
</DataTemplate>
</local:MySelector.UpperTemplate>
<local:MySelector.LowerTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="lower - "></TextBlock>
<TextBlock Text="{Binding}"></TextBlock>
</StackPanel>
</DataTemplate>
</local:MySelector.LowerTemplate>
</local:MySelector>
</Window.Resources>
<DockPanel>
<Button DockPanel.Dock="Bottom" Click="doit_Click">Do It</Button>
<DataGrid Name="mainGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding FirstName}" ContentTemplateSelector="{StaticResource mySelector}"></ContentPresenter>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Window>
以及背后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace TestSAS
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
mainGrid.ItemsSource = "Bob,mary,frank,George".Split(',').Select(s => new Person() { FirstName = s }).ToArray();
}
private void doit_Click(object sender, RoutedEventArgs e)
{
((Person[])mainGrid.ItemsSource)[2].FirstName = "Frank";
}
}
public class MySelector : DataTemplateSelector
{
public DataTemplate UpperTemplate { get; set; }
public DataTemplate LowerTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var st = item as string;
if (st == null) return null;
if (st.Substring(0, 1).ToString().ToLower() == st.Substring(0, 1).ToString()) return LowerTemplate;
return UpperTemplate;
}
}
public class Person : INotifyPropertyChanged
{
private string firstName;
public string FirstName
{
get { return firstName; }
set
{
firstName = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
编辑:我删除了之前的答案,即使用转换器而不是选择器。这确实有效,但我认为这是一个更好的答案。
关于WPF DataTemplateSelector 标准更改但模板未重新应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5940152/
在两个之间切换 ItemTemplates在我的 ListView基于当前的 Item 类型,我实现了一个 DataTemplateSelector .我是通过 Binding 添加的到 ListVi
我有一个应用于 DataGridTemplateColumn 的 DataTemplateSelector。它正确地为我提供了一个 DataTemplate,该模板根据我的 DataRow(在其他列中
使用 dataTemplateSelector 根据枚举值为我的 View 模型选择正确的数据模板时遇到一点问题。 这是一个重现问题的演示。 我有一个由我的 viewModels 使用的模型层次结构
我有 ContentPresenter 和 DataTemplateSelector: ... public override DataTemplate SelectTemplate(
我正在使用带有 ModelView-First 方法的 MVVM 模式。到目前为止,这工作正常。 现在我有一个用户控件( View ),它应该根据位于我的 ViewModel 中的属性显示各种内容。
我在列表框中使用 DatatemplateSelector。 我的数据没有按需拉伸(stretch)(灰色圆圈必须在列表框的右侧)
我的应用中需要一个数据模板选择器。我找到了 this blog在 7.0 上效果很好。将我的项目升级到 7.1 后,设置模板时出现“未指定错误”。我试着把他们在博客上发布的示例项目升级到芒果,它仍然有
我正在使用 LongListSelector 来实现我的项目的列表或网格显示。为此,我创建了一个 DataTemplateSelector 并在运行时更改了 LayoutMode 属性。这是可行的,但
这是我拥有的 XAML: 这是我的 ListTemplateSelector 类: public class ListTemplateSelector : DataTemplateSelector
我将 ContentControl.DataTemplateSelector 设置为我想要的。 我希望根据命令或其他方式调用 ContentControl 以通过 xaml 或代码从选择器中重新选择模
我想设计一个 DataTemplateSelector,它将给定值与传入的参数进行比较,并在值优劣时选择正确的模板 我带来了以下内容: class InferiorSuperiorTemplateSe
如何更改 UWP 项目中 ListView 的 SelectedItem 的 DataTemplate?我正在尝试使用 DataTemplateSelector,但问题是 SelectTemplate
走出我的 .net 踩踏地,似乎无法弄清楚是否有与您在 .net 中使用 DataTemplateSelector 的等效项,但用于 ionic 驱动的 html5 和 angularjs 元素。有人
我正在制作一个自定义的水平滚动 ListView 类型控件,我遇到了一个我无法解释的问题,而且我不能 100% 确定这个问题是否与我的代码有关,除非我误会了什么。 我已将问题提炼成最简单的形式,可在
我知道有这个帖子:How to find a resource in a UserControl from a DataTemplateSelector class in WPF? 问同样的问题。 但
我有一个使用 StackPanel 的 ItemsControl 来显示项目列表。 我希望每行都显示一个标签,但标签左侧的内容由 DataTemplateSelector 定义。我不想为 Templa
我正在尝试构建一个 ContentControl -派生控件(我们称之为 MyContentControl ),它将有其 ControlTemplate由 DataTemplateSelector 的
我有两个列表框,默认的和自定义的。一个正确使用 DataTemplateSelector 而另一个只使用默认的 DataTemplates 从不调用选择器; //shows correctly //
我有一个动态数据透视项模板,如下所列:
我有一个简单的问题。我的 Xamarin Forms 页面上定义了两个数据模板。我想在按下按钮时将一个换成另一个。我知道使用 ListView 我可以使用 ItemTemplate 并绑定(bind)
我是一名优秀的程序员,十分优秀!