Подтвердить что ты не робот

Как избавиться от раздражающего предупреждения о привязке 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

Любая помощь действительно оценена

4b9b3361

Ответ 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;
    }
}

И вуаля! Больше ошибок нет :-)