/ / ComboBoxItem продовжує кидати помилку прив’язки, незважаючи на стиль - wpf, прив'язка даних, combobox, шаблон даних

ComboBoxItem продовжує викидати помилку прив'язки, незважаючи на стиль - wpf, data binding, combobox, dattemplate

Хороший день,

У мене є комбобокс, який я заповнюю за допомогою CollectionViewSource. Елементи будуються за допомогою шаблону даних для типу вхідного елемента (у цьому випадку ProjectViewModel). Це в WPF в .NET 4.0.

У своєму window.resources я вказав таке:

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

Незважаючи на цей стиль, я все одно отримую такі помилки:

System.Windows.Помилка даних: 4: Не вдається знайти джерело для зв’язування з посилання "RelativeSource FindAncestor, AncestorType = "System.Windows.Controls.ItemsControl", AncestorLevel = "1" ". BindingExpression: Path = HorizontalContentAlignment; DataItem = null; цільовим елементом є "ComboBoxItem" (Name = ""); цільовий властивість "HorizontalContentAlignment" (тип "HorizontalAlignment")

System.Windows.Помилка даних: 4: Не вдається знайти джерело для зв’язування з посилання "RelativeSource FindAncestor, AncestorType = "System.Windows.Controls.ItemsControl", AncestorLevel = "1" ". BindingExpression: Path = VerticalContentAlignment; DataItem = null; цільовим елементом є "ComboBoxItem" (Name = ""); цільовий властивість "VerticalContentAlignment" (тип "VerticalAlignment")

Я вказав горизонтальну та вертикальнуContentAlignment також для елемента ComboBox безрезультатно. Це не страшна проблема, оскільки предмети виглядають правильно. однак при налагодженні я отримую приблизно 10 секунд затримки при закритті вікна, в той час як він видає близько 4000 повідомлень про помилки у вихідному вікні (що мені потрібно відкрити, щоб знайти законні помилки прив'язки.

Можливо, я неправильно читаю помилку. Чому він не може знайти дійсне джерело для прив’язки? Наскільки я знаю, спосіб використання ComboBox та CollectionViewSource відповідає їх намірам.

Відповіді:

3 для відповіді № 1

Я просто хочу зазначити, що я боровся з цимпроблема протягом двох днів. Найпоширеніше пропоноване рішення (додавання стилю горизонтального / вертикального контенту до свого елемента або навіть до App.xaml) не завжди вирішує проблему.

Врешті-решт я виявив щось унікальне для моєї власної ситуації - сподіваюся, це може комусь допомогти: Якщо ви використовуєте FilterEventHandler, не скасовуйте підписку перед повторною підпискою!

Мій старий код продовжував генерувати повідомлення "Помилка даних 4" щоразу, коли я змінював фільтр каналів (який викликає 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;
}
}

... тож я змінив його, щоб кожен раз повторно підписуватися на FilterEventHandler і, швидше, ставив чек на нуль на каналі Filter у способі обробки подій.

// 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! Більше помилок :-)


1 для відповіді № 2

Я "думав, що я вирішив цю проблему у власній програмі, але виявив, що вона постійно переривається. Нарешті вдалося віднайти джерело випуску.

Якщо ви використовуєте комбобокс, підкріплений ICollectionView, і ви укладаєте дві або більше collectionView.Refresh() дзвінки в чергу подій (тобто: викликати оновлення двічі через дві різні операції очищення, наприклад), що призведе до того, що він генерує спам про помилки прив’язки на кожному елементі комбінації для кожного додаткового Refresh() здійснено дзвінок. Ця помилка прив’язки стане лише після того, як ви відкрили комбобокс хоча б один раз.

Перепишіть його так, щоб ви тільки дзвонили Refresh() один раз для даної події запобіжить появі помилки зв’язування.


0 для відповіді № 3

Я не знаю, чи вам ще потрібна допомога з цього приводу, але я просто придумав спосіб зробити цю помилку / попередження нездатною. У своєму комбоботі я переглянув властивість ItemTemplate таким чином:

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

YourBinding - це значення, яке ви використовували б як "DisplayMemberPath" для ComboBox