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.