尽管样式,ComboBoxItem继续抛出绑定错误

时间:2013-02-25 15:51:36

标签: wpf data-binding combobox datatemplate

美好的一天,

我有一个通过CollectionViewSource填充的组合框。这些项目是通过传入项目类型的数据模板(在本例中为ProjectViewModel)构建的。这是在.NET 4.0中的WPF中。

在我的window.resources中,我指定了以下内容:

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

尽管有这种风格,我仍然会收到以下错误:

  

System.Windows.Data错误:4:找不到绑定源   参考'RelativeSource FindAncestor,   AncestorType = 'System.Windows.Controls.ItemsControl',   AncestorLevel = '1'”。 BindingExpression:路径= Horizo​​ntalContentAlignment;   的DataItem = NULL; target元素是'ComboBoxItem'(Name ='');目标   property是'Horizo​​ntalContentAlignment'(类型'Horizo​​ntalAlignment')

     

System.Windows.Data错误:4:找不到绑定源   参考'RelativeSource FindAncestor,   AncestorType = 'System.Windows.Controls.ItemsControl',   AncestorLevel = '1'”。 BindingExpression:路径= VerticalContentAlignment;   的DataItem = NULL; target元素是'ComboBoxItem'(Name ='');目标   property是'VerticalContentAlignment'(类型'VerticalAlignment')

我也在ComboBox元素上指定了Horizo​​ntal和Vertical ContentAlignment,但无济于事。由于项目正确显示,这不是一个可怕的问题。但是在调试时,关闭窗口时我会得到大约10秒的延迟,同时它会向输出窗口输出大约4000条错误消息(我需要打开以捕获合法的绑定错误。

我可能没有正确阅读错误。为什么它找不到绑定的有效来源?据我所知,我使用ComboBox和CollectionViewSource的方式符合他们的意图。

4 个答案:

答案 0 :(得分:3)

我只想提一下我在这个问题上挣扎了两天。最常见的建议解决方案(将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;
    }
}

Et Voila!没有更多错误: - )

答案 1 :(得分:3)

我以为我已经在我自己的程序中解决了这个问题,但发现它一直在间歇性地出现。最后设法找出问题的根源。

如果您正在使用由ICollectionView支持的组合框,并且您在事件队列上堆叠了两个或更多collectionView.Refresh()个调用(即:由于两个不同的清理操作,调用刷新两次,例如),这将导致它为每个额外的Refresh()调用在组合框的每个元素上生成绑定错误垃圾邮件。只有在至少打开一次组合框后才会出现此绑定错误。

重写它以便您只为给定事件调用一次Refresh()将阻止弹出绑定错误。

答案 2 :(得分:0)

我不知道你是否还需要这方面的帮助,但我只想出办法让这个错误/警告消失。 在我的组合框中,我重新定义了ItemTemplate属性,如下所示:

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

YourBinding是您将用作&#34; DisplayMemberPath&#34;的值。对于ComboBox

答案 3 :(得分:0)

与这个错误斗争了几个小时,尝试了谷歌的所有解决方案,只有这个有效,从组合框样式中删除 OverridesDefaultStyle 属性行:

// before
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="OverridesDefaultStyle" Value="true" />

// after
<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true" />

在数据网格单元格内使用组合框的样式模板 https://docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/combobox-styles-and-templates?view=netframeworkdesktop-4.8