2013-02-25 86 views
2

美好的一天,ComboBoxItem繼續拋出綁定錯誤,儘管風格

我有一個combobox,我通過一個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 Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')

我指定的水平和垂直的ContentAlignment在ComboBox元素上,也無濟於事。這並不是一個可怕的問題,因爲這些項目顯示正確。然而,在調試時,當關閉窗口時,我確實得到大約10秒的延遲,同時它向輸出窗口輸出大約4000條錯誤消息(我需要打開這個窗口才能捕獲合法的綁定錯誤。)

我可能沒有正確讀取錯誤。爲什麼找不到綁定的有效源?據我所知,我使用ComboBox和CollectionViewSource的方式與他們的意圖一致。

+0

我認爲有人在這裏解決這個問題:http://stackoverflow.com/questions/2666439/how-to-get-rid-of-annoying-horizo​​ntalcontentalignment-binding-warning – 2013-02-25 15:57:21

+0

@DJBurb在這個問題的兩個建議基本上與我在解決方案中的風格相同。我曾嘗試在App.xaml中級別的風格,我試圖將其命名爲類型名ASLO。沒有變化。令人奇怪的是在進行在圓K. – CodeWarrior 2013-02-25 16:03:42

回答

3

我只想提一提我爲這個問題而奮鬥最常見的建議解決方案(向您的元素或甚至App.xaml添加Horizo​​ntal/VerticalContentAlignment樣式)並不總能解決問題。 lly,我發現了一些與我自己的情況相似的東西 - 我希望它對某人有所幫助:如果您使用的是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!沒有更多的錯誤:-)

0

我不知道你是否仍然需要幫助,但我只是想出了一種方法來使這個錯誤/警告disapear。 在我的組合框,我重新定義了ItemTemplate屬性是這樣的:

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

YourBinding是你的「的DisplayMemberPath」使用組合框的值

+0

我早已完成了這個項目,並且不容易訪問源。我想* *我有一個自定義的ItemTemplate,但我不知道。不幸的是,就像是個月(如果有的話)之前,我回到這個項目再次可以檢查。 – CodeWarrior 2014-01-14 19:42:14

1

我還以爲我已經解決了這個問題我自己的節目,但發現它不斷彈出。最後設法追查問題的根源。

如果您使用由ICollectionView支持的組合框,你棧上的事件隊列兩個或兩個以上collectionView.Refresh()電話(即:調用刷新兩次,因爲兩個不同的清理操作,例如),這將導致其在每個附加的Refresh()調用中,在組合框的每個元素上生成綁定錯誤垃圾郵件。此綁定錯誤只會在您打開組合框至少一次後纔會發生。

重寫,這樣你只能叫Refresh()一次給定的事件會阻止綁定錯誤從彈出。

相關問題