/ / ComboBoxItem nadal wyświetla błąd wiązania pomimo stylu - wpf, powiązanie danych, combobox, tablica danych

ComboBoxItem nadal rzuca błąd wiązania pomimo stylu - wpf, binding danych, combobox, datatemplate

Dobry dzień,

Mam combobox, który wypełniam za pośrednictwem CollectionViewSource. Elementy są budowane za pomocą tabliczki danych dla typu przychodzącego elementu (w tym przypadku ProjectViewModel). To jest w WPF w .NET 4.0.

W moim window.resources określiłem:

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

Mimo tego stylu nadal pojawiają się następujące błędy:

System.Windows.Błąd danych: 4: Nie można znaleźć źródła powiązania z odniesienie "RelativeSource FindAncestor, AncestorType = "System.Windows.Controls.ItemsControl", AncestorLevel = "1" ". BindingExpression: Path = HorizontalContentAlignment; DataItem = null; elementem docelowym jest „ComboBoxItem” (Name = „”); cel właściwość to „HorizontalContentAlignment” (wpisz „HorizontalAlignment”)

System.Windows.Błąd danych: 4: Nie można znaleźć źródła powiązania z odniesienie "RelativeSource FindAncestor, AncestorType = "System.Windows.Controls.ItemsControl", AncestorLevel = "1" ". BindingExpression: Path = VerticalContentAlignment; DataItem = null; elementem docelowym jest „ComboBoxItem” (Name = „”); cel właściwość to „VerticalContentAlignment” (wpisz „VerticalAlignment”)

Podałem poziomo i pionowoContentAlignment na elemencie ComboBox również bezskutecznie. To nie jest straszny problem, ponieważ elementy pojawiają się poprawnie. jednak podczas debugowania dostaję około 10 sekund opóźnienia podczas zamykania okna, gdy wyświetla ono około 4000 komunikatów o błędach do okna wyjściowego (które muszę otworzyć, aby wyłapać uzasadnione błędy wiązania).

Być może błąd nie jest prawidłowy. Dlaczego nie może znaleźć prawidłowego źródła powiązania? O ile wiem, sposób, w jaki korzystam z ComboBox i CollectionViewSource jest zgodny z ich intencją.

Odpowiedzi:

3 dla odpowiedzi № 1

Chcę tylko wspomnieć, że miałem z tym problemproblem przez dwa dni. Najczęstsze sugerowane rozwiązanie (dodanie stylu Horizontal / VerticalContentAlignment do elementu, a nawet App.xaml) NIE zawsze rozwiązuje problem.

W końcu odkryłem coś wyjątkowego dla mojej sytuacji - mam nadzieję, że może komuś pomóc: Jeśli korzystasz z FilterEventHandler, nie anuluj subskrypcji przed ponownym subskrybowaniem!

Mój stary kod generował komunikat „Błąd danych 4” za każdym razem, gdy zmieniałem filtr kanałów (który wywołuje 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;
}
}

... więc zmieniłem go, aby ponownie subskrybować FilterEventHandler za każdym razem, i raczej sprawdzam, czy wartość Null na Channel Filter jest w metodzie obsługi zdarzeń.

// 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;
}
}

Zrobione! Nigdy więcej błędów :-)


1 dla odpowiedzi nr 2

Myślałem, że rozwiązałem ten problem w moim własnym programie, ale stwierdziłem, że pojawiał się sporadycznie. W końcu udało się wyśledzić źródło problemu.

Jeśli używasz comboboxa wspieranego przez ICollectionViewi układasz dwa lub więcej collectionView.Refresh() wywołuje kolejkę zdarzeń (tj .: wywołanie odświeżania dwukrotnie z powodu dwóch różnych operacji czyszczenia, na przykład), które spowodują, że wygeneruje on błąd wiązania spam na każdym elemencie combobox dla każdego dodatkowego Refresh() wykonane połączenie. Ten błąd wiązania wystąpi tylko po przynajmniej otwarciu opakowania zbiorczego.

Przepisz go tak, żebyś tylko dzwonił Refresh() jeden raz dla danego zdarzenia zapobiegnie wyskakiwaniu błędu wiązania.


0 dla odpowiedzi № 3

Nie wiem, czy nadal potrzebujesz pomocy w tym zakresie, ale właśnie wymyśliłem sposób, aby ten błąd / ostrzeżenie zniknęło. W moim comboboxie przedefiniowałem właściwość ItemTemplate w następujący sposób:

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

YourBinding to wartość, której użyłbyś jako „DisplayMemberPath” dla ComboBox