gpt4 book ai didi

WPF DataTemplateSelector 标准更改但模板未重新应用?

转载 作者:行者123 更新时间:2023-12-02 05:09:31 26 4
gpt4 key购买 nike

我有一个应用于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com