Как избавиться от надоедливого предупреждения о связывании HorizontalContentAlignment? - PullRequest
15 голосов
/ 19 апреля 2010

Я работаю над большим проектом WPF, и во время отладки мое окно вывода заполняется этими раздражающими предупреждениями:

Сведения о System.Windows.Data: 10: невозможно получить значение с помощью привязки, и допустимое> резервное значение не существует; вместо этого используется значение по умолчанию. BindingExpression: Path = HorizontalContentAlignment; DataItem = null; целевой элемент ' ComboBoxItem ' (Name = ''); Целевое свойство равно «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 ControlTemplate

Любая помощь очень ценится

Ответы [ 4 ]

10 голосов
/ 15 февраля 2012

Это сработало для меня. Поместите это в файл 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

1 голос
/ 13 марта 2013

Та же проблема с «MenuItem», если он размещен непосредственно на панелях, таких как «StackPanel» и т. Д. И может быть исправлен с помощью ответа Картера выше, просто замените «ComboBoxItem» на «MenuItem» в этом «стиле»

1 голос
/ 27 сентября 2011

Я не знаю, по прошествии более года, если вы по-прежнему интересуетесь этой проблемой, но мое решение состояло в том, чтобы явно написать в стиле значение для этого. Например:

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

И это просто решило эту проблему.

0 голосов
/ 22 октября 2013

Я просто хочу упомянуть, что я боролся с подобной проблемой в течение двух дней (у меня была ошибка «Ошибка данных 4 в Windows» с жалобами на HorizontalContentAlignment и VerticalContentAlignment).

Наиболее распространенное предлагаемое решение (добавление стиля Horizontal / VerticalContentAlignment к вашему элементу или даже к 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 каждый раз, и вместо этого поставил проверку на нулевое значение в Channel 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! Больше ошибок нет: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...