Как избавиться от раздражающего предупреждения о привязке HorizontalContentAlignment?
Я работаю над большим проектом WPF, и во время отладки мое окно вывода заполняется этими раздражающими предупреждениями:
System.Windows.Data Information: 10: Не удается получить значение с использованием привязки и не существует допустимого > резервного значения; используя вместо этого по умолчанию. BindingExpression: Path = HorizontalContentAlignment; DataItem = null; целевой элемент ' ComboBoxItem' (Name= ''); target является "HorizontalContentAlignment" (тип > ' HorizontalAlignment ')
В конкретном примере ComboBoxItem оформлен таким образом:
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Border
Name="bd"
Padding="4,4,4,4"
SnapsToDevicePixels="True"
CornerRadius="2,2,2,2">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="true">
<Setter TargetName="bd" Property="Background" Value="{StaticResource MediumBrush}"/>
<Setter TargetName="bd" Property="Padding" Value="4,4,4,4"/>
<Setter TargetName="bd" Property="CornerRadius" Value="2,2,2,2"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Я знаю, что проблема возникает из-за определения темы по умолчанию для ComboBoxItem, которая содержит такие вещи, как:
<Setter Property="Control.HorizontalContentAlignment">
<Setter.Value>
<Binding Path="HorizontalContentAlignment" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ItemsControl, AncestorLevel=1}" />
</Setter.Value>
</Setter>
но я также подумал, что используя
<Setter Property="OverridesDefaultStyle" Value="True"/>
позаботился о проблеме, и вместо этого предупреждения все еще существуют.
РЕДАКТИРОВАТЬ: Чтобы воспроизвести проблему, вам нужно также переопределить стиль ComboBox, как это сделано в этом примере из MSDN:
Пример панели управления ComboBox
Любая помощь действительно оценена
Ответы
Ответ 1
Это сработало для меня. Поместите это в файл Application.xaml.
<Application.Resources>
<Style TargetType="ComboBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
</Application.Resources>
от...
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/42cd1554-de7a-473b-b977-ddbd6298b3d0
Ответ 2
Я не знаю, если через год вас все еще интересует эта проблема, но мое решение заключалось в том, чтобы явно написать в стиле значение для этого. Например:
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
И это просто решило эту проблему.
Ответ 3
Такая же проблема связана с "MenuItem", если она помещается непосредственно в панели типа "StackPanel" и т.д. И может быть исправлена с использованием ответа Carter выше, просто замените "ComboBoxItem" на "MenuItem" в этом "стиле"
Ответ 4
Я просто хочу упомянуть, что я боролся с подобной проблемой в течение двух дней (у меня была ошибка "Ошибка данных 4 в Windows" с жалобами на HorizontalContentAlignment
и VerticalContentAlignment
).
Наиболее распространенное предлагаемое решение (добавление стиля Horizontal/VerticalContentAlignment к вашему элементу или даже к App.xaml) НЕ всегда решает проблему.
В конце концов, я обнаружил что-то уникальное для моей собственной ситуации - я надеюсь, что это может кому-то помочь: если вы используете FilterEventHandler
, не 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, и вместо этого поставил проверку на нулевое значение для фильтра канала в методе обработки событий.
// 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;
}
}
И вуаля! Больше ошибок нет :-)