如何摆脱烦人的 Horizo​​ntalContentAlignment 绑定警告?

Posted

技术标签:

【中文标题】如何摆脱烦人的 Horizo​​ntalContentAlignment 绑定警告?【英文标题】:How to get rid of annoying HorizontalContentAlignment binding warning? 【发布时间】:2011-02-09 14:54:07 【问题描述】:

我正在处理一个大型 WPF 项目,在调试期间,我的输出窗口充满了这些烦人的警告:

System.Windows.Data 信息:10:无法使用绑定检索值,并且不存在有效的 > 后备值;改用默认值。 BindingExpression:Path=Horizo​​ntalContentAlignment; DataItem=null; 目标元素是 'ComboBoxItem' (Name='');目标属性是'Horizo​​ntalContentAlignment'(类型>' 水平对齐')

在具体示例中,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 Example

非常感谢任何帮助

【问题讨论】:

我无法在 4.0 和 3.5 中重现此 XAML 的问题。它运行良好,没有任何绑定警告。 你是对的,我单独测试了,它没有给我警告,我编辑问题以获取更多详细信息 我在您在编辑中链接的示例中看不到有问题的绑定。 要查看此类警告,您必须设置出现的消息级别。如果设置为全部,那么这很常见。这可以在 app.config 文件中更改。 【参考方案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

【讨论】:

如果我不是唯一一个认为样式可以放在任何常见位置的人——比如元素本身,或者它的父窗口/用户控件等——并且未能修复它,我想指出,由于某种我不知道的原因,它只适用于 Application.Resources (如this answer所示)。 andrew 的评论是对的!!我对 ComboBoxes 也有同样的问题......太糟糕了,我注意到评论太晚了,只有在将这些行放入 ResourceDictionary、ComboBox、 等之后......【参考方案2】:

我不知道一年多后你是否仍然对这个问题感兴趣,但我的解决方案是在样式中明确写下这个问题的值。例如:

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

这样就解决了这个问题。

【讨论】:

【参考方案3】:

我只想提一下,我为类似的问题苦苦挣扎了两天(我的是“Windows 数据错误 4”错误,抱怨 HorizontalContentAlignmentVerticalContentAlignment)。

最常见的建议解决方案(将 Horizo​​ntal/VerticalContentAlignment 样式添加到您的元素,甚至添加到 App.xaml)并不总能解决问题。

最后,我发现了一些对我自己的情况独特的东西——我希望它可以对某人有所帮助:如果您使用的是FilterEventHandler,请在重新订阅之前不要取消订阅!

每当我更改通道过滤器(调用 UpdateCorporatesList)时,我的旧代码都会不断生成“数据错误 4”消息:

// 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是否为null。

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

瞧!没有更多错误:-)

【讨论】:

以上是关于如何摆脱烦人的 Horizo​​ntalContentAlignment 绑定警告?的主要内容,如果未能解决你的问题,请参考以下文章

隐藏 Horizo​​ntalScrollView 的滚动条

如何使用 RichTextBox 消除烦人的 BEEP

Xcode:如何摆脱这个 AdMob 日志消息?

QTableView Horizo​​ntalHeader 让它非常滞后?

如何摆脱XXX自动生成的方法存根

iOS 9 iPad 键盘摆脱“撤消视图”