wpf templates xaml triggers celltemplate

wpf - Cómo activar cellTemplateSelector cuando los elementos cambiaron



xaml triggers (2)

La forma más fácil es conectar el evento Selección de cuadro combinado del cuadro combinado y reasignar el selector de plantilla. Esto fuerza una actualización.

En XAML (suponga el resto de DataGrid / ComboBoxColumn:

<DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.Gates, UpdateSourceTrigger=PropertyChanged}"/> <EventSetter Event="SelectionChanged" Handler="GateIDChanged" /> </Style>

Eso se refiere a este DataGridTemplateColumn:

<DataGridTemplateColumn x:Name="GateParamsColumn" Header="Gate Parameters" CellTemplateSelector="{StaticResource GateParamsTemplateSelector}"></DataGridTemplateColumn>

Y en el código detrás:

private void GateIDChanged(object sender, SelectionChangedEventArgs eventArgs) { var selector = GateParamsColumn.CellTemplateSelector; GateParamsColumn.CellTemplateSelector = null; GateParamsColumn.CellTemplateSelector = selector; }

Tengo 2 plantillas para CellTemplate de DataGrid. Cuando cambio los artículos, no me ayudará a seleccionar la plantilla, ¡ni siquiera se llamará a DisplayModeTemplateSelector!

Lo que me pregunto es si hay una forma de activar este CellTemplateSelector nuevamente cuando los elementos cambian? Cómo actualizar CellTemplate en DataGrid o ListView cuando el contenido cambia

<DataGridTemplateColumn x:Name="colorRange" Width="*" Header="Color Range"> <DataGridTemplateColumn.CellTemplateSelector> <local:DisplayModeTemplateSelector HeatMapTemplate="{StaticResource heatMapTemplate}" ThreshHoldTemplate="{StaticResource threshHoldTemplate}" /> </DataGridTemplateColumn.CellTemplateSelector> </DataGridTemplateColumn>

Encontré este blog http://dotdotnet.blogspot.com/2008/11/refresh-celltemplate-in-listview-when.html

¡Creo que esto es similar a mi problema, pero realmente no puedo entenderlo! ¿Alguien puede explicarlo?


La solución en la publicación del blog no funcionará con el control DataGrid porque la clase DataGridTemplateColumn no pertenece al Visual Tree, e incluso cuando traté de vincularla a una clase estática, no sucedió debido a extrañas excepciones después de la propiedad cambios.

De todos modos, hay dos formas posibles de resolver este problema.

1) La manera más fácil.

Usando la clase ObservableCollection .

var itemIndex = 0; var currentItem = vm.Items[itemIndex]; //Change necessary properties //.. vm.Items.Remove(currentItem); vm.Items.Insert(itemIndex, currentItem);

2) La forma más compleja.

Puede agregar a su clase de elemento la propiedad que devuelve el objeto en sí.

public ItemViewModel(/*...*/) { this.SelfProperty = this; //... } public ItemViewModel SelfProperty { get; private set; } public void Update() { this.SelfProperty = null; this.OnPropertyChanged("SelfProperty"); this.SelfProperty = this; this.OnPropertyChanged("SelfProperty"); }

Después de eso, puede usar ContentControl.ContentTemplateSelector lugar de CellTemplateSelector esta manera:

<DataGridTemplateColumn Header="Color Range"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ContentControl Content="{Binding SelfProperty}" ContentTemplateSelector="{StaticResource mySelector}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>

Y cuando cambie la propiedad, llame al método de Update alguna manera:

currentItem.SomeDataProperty = "some new value"; //Or you can add this method call to the OnPropertyChanged //so that it calls authomatically currentItem.Update();

La razón por la que he establecido un valor nulo para la SelfProperty en el método de Update primero, es que el Selector no actualizará una plantilla hasta que la propiedad de Content se SelfProperty por completo. Si configuro el mismo objeto una vez más, no pasará nada, pero si primero establezco un valor nulo, se manejarán los cambios.