/ / ComboBoxItem continúa generando un error de enlace a pesar del estilo: wpf, enlace de datos, cuadro combinado, placa de datos

ComboBoxItem continúa lanzando un error de enlace a pesar del estilo - wpf, data-binding, combobox, datatemplate

Buen día,

Tengo un cuadro combinado que estoy llenando a través de un CollectionViewSource. Los elementos se crean a través de una placa de datos para el tipo de elemento entrante (en este caso, un ProjectViewModel). Esto está en WPF en .NET 4.0.

En mi window.resources, he especificado lo siguiente:

    <Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>

A pesar de este estilo, todavía estoy recibiendo los siguientes errores:

System.Windows.Error de datos: 4: no se puede encontrar el origen para enlazar con referencia "RelativeSource FindAncestor, AncestorType = "System.Windows.Controls.ItemsControl", AncestorLevel = "1" ". BindingExpression: Path = HorizontalContentAlignment; DataItem = null; el elemento de destino es "ComboBoxItem" (Name = ""); objetivo la propiedad es "HorizontalContentAlignment" (tipo "HorizontalAlignment")

System.Windows.Error de datos: 4: no se puede encontrar el origen para enlazar con referencia "RelativeSource FindAncestor, AncestorType = "System.Windows.Controls.ItemsControl", AncestorLevel = "1" ". BindingExpression: Path = VerticalContentAlignment; DataItem = null; el elemento de destino es "ComboBoxItem" (Name = ""); objetivo la propiedad es "VerticalContentAlignment" (tipo "VerticalAlignment")

He especificado el horizontal y el vertical.ContentAlignment en el elemento ComboBox también, en vano. Esto no es un problema terrible ya que los elementos aparecen correctamente. Sin embargo, al realizar la depuración, obtengo una demora de aproximadamente 10 segundos al cerrar la ventana mientras se envían alrededor de 4000 mensajes de error a la ventana de salida (que necesito abrir para detectar errores de enlace legítimos).

Puede que no esté leyendo el error correctamente. ¿Por qué no puede encontrar una fuente válida para el enlace? Por lo que sé, la forma en que uso ComboBox y CollectionViewSource está en línea con su intención.

Respuestas

3 para la respuesta № 1

Solo quiero mencionar que luché con estoProblema por dos días. La solución sugerida más común (agregar el Estilo de alineación de contenido horizontal / vertical a su elemento, o incluso a App.xaml) NO siempre resuelve el problema.

Finalmente, descubrí algo único para mi propia situación, espero que pueda ser de ayuda para alguien: Si está utilizando FilterEventHandler, ¡no cancele la suscripción antes de volver a suscribirse!

Mi antiguo código seguía generando ese mensaje de "Error de datos 4" cada vez que cambiaba el Filtro de canales (que llama a UpdateCorporatesList):

// This code generates errors
private void UpdateCorporatesList()
{
this.CorporatesViewSource.Filter -= new FilterEventHandler(ApplyCorporateFilter);

if (this.ChannelFilter != null)
{
this.CorporatesViewSource.Filter += new FilterEventHandler(ApplyCorporateFilter);
}
else
{
this.CorporateFilter = null;
}
}

private void ApplyCorporateFilter(object sender, FilterEventArgs e)
{
SalesCorporate customer = e.Item as SalesCorporate;
var currentChannel = this.Channels.FirstOrDefault(x => x.ID == this.ChannelFilter).Description;
if ((customer.ID != null) && (customer.Channel != currentChannel))
{
e.Accepted = false;
}
}

... así que lo cambié para volver a suscribirme a FilterEventHandler cada vez, y más bien puse la marca de verificación de un filtro de canal en el método de manejo de eventos.

// This code works as intended
private void UpdateCorporatesList()
{
this.CorporatesViewSource.Filter += new FilterEventHandler(ApplyCorporateFilter);

if (this.ChannelFilter == null)
{
this.CorporateFilter = null;
}
}

private void ApplyCorporateFilter(object sender, FilterEventArgs e)
{
var currentChannel = this.Channels.FirstOrDefault(x => x.ID == this.ChannelFilter);
if (currentChannel.ID == null)
{
return;
}

SalesCorporate customer = e.Item as SalesCorporate;
if ((customer.ID != null) && (customer.Channel != currentChannel.Description))
{
e.Accepted = false;
}
}

Et Voila! No más errores :-)


1 para la respuesta № 2

Pensé que había resuelto este problema en mi propio programa, pero encontré que seguía apareciendo intermitentemente. Finalmente logró rastrear la fuente del problema.

Si estás usando un combobox respaldado por un ICollectionView, y apilas dos o mas collectionView.Refresh() llama a la cola de eventos (es decir: llamar a la actualización dos veces debido a dos operaciones de limpieza diferentes, por ejemplo), que harán que genere el error de enlace de spam en cada elemento del cuadro combinado para cada Refresh() llamada hecha Este error de enlace solo ocurrirá después de haber abierto el cuadro combinado al menos una vez.

Reescribiéndolo para que solo llames. Refresh() una vez para un evento dado evitará que aparezca el error de enlace.


0 para la respuesta № 3

No sé si todavía necesitas ayuda con esto, pero acabo de descubrir una manera de hacer que este error / advertencia desaparezca. En mi combobox, redefiní la propiedad ItemTemplate de esta manera:

<ComboBox.ItemTemplate>
<ItemContainerTemplate>
<TextBlock Text="{Binding Path=YourBinding}"/>
</ItemContainerTemplate>
</ComboBox.ItemTemplate>

YourBinding es el valor que usaría como "DisplayMemberPath" para el ComboBox