2013-11-21 57 views
3

我有四行一格:WPF行高度結合用戶後停止工作使用GridSplitter

<Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/>     
      <RowDefinition Height="{Binding DocumentsHeight}"/> 
      <RowDefinition Height="Auto"/> - GRIDSPLITTER 
      <RowDefinition Height="{Binding ApprovedDocumentsHeight}" /> 
</Grid.RowDefinitions> 

行的動態調整大小正常工作,高度被綁定爲字符串值與像「5 *」。但是當用戶使用GridSplitter時,綁定停止工作,當我想要改變行的大小時,在下一次通知後不會調用getter。有人知道問題在哪裏嗎?

感謝您的幫助。

回答

4

如果您綁定除GridLength之外的任何內容,綁定將會中斷。 您可以綁定到這樣的GridLength屬性...

private double documentsHeight = 100; 

    public GridLength DocumentsHeight 
    { 
     get { return this.GridLength(this.documentsHeight); } 
     set { this.documentsHeight = value.Value; } 
    } 

你也將需要設置模式=雙向對您具有約束力。

+0

絕對正確。您也可以使用IValueConverter在double和GridLength之間進行轉換。 –

0

可能是很多事情。分割器必須「接管」行/列定義以改變寬度/高度。這可能會導致綁定被刪除。編寫代碼需要一些時間,看看究竟發生了什麼,但是因爲我們已經知道它失敗了,所以它沒有意義。

所以它可能無法做到你想要的東西很容易。如果是我,我會通過將它包裝在UserControl中來表達我想要的功能。在UserControl上公開DependencyProperties對於DocumentsHeightApprovedDocumentsHeight。我會將change event handlers添加到這些屬性中,然後從控件的代碼隱藏中適當地調整分隔符位置。

+0

我只是發現了它可能工作,如果我綁定到GridLength而不是字符串,要去嘗試,第一。 – user2849936

0

要做到這一點,分離器通過將Height屬性設置爲顯式值來調整其上方行的高度。這會導致對SetValue的調用,從中刪除綁定。您必須手動恢復綁定才能使用更改通知來更新行大小,但如果您正在執行此操作,那麼您可能只需考慮直接設置Height而不是使用綁定。或者,您可以創建自己的分離器,使用Height屬性的SetCurrentValue,它不會覆蓋現有的綁定。

+0

所以我通過使用雙向模式將綁定設置爲GridLength屬性來實現它。這樣,網格分割器正確設置值並且綁定不會中斷。 – user2849936

+0

在gridsplitter後代中,我將如何調用SetCurrentValue並阻止SetValue被調用? – eriksmith200

+0

不要做分裂的後代,做一個替代控制。 –

0

所以我通過使用雙向模式將綁定設置爲GridLength屬性來解決問題。這樣,網格分割器正確設置值並且綁定不會中斷。

1

可重複使用的解決辦法是使用一個轉換器...

public class DoubleToGridLengthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     try 
     { 
      return new GridLength((double)value, GridUnitType.Pixel); 
     } 
     catch (InvalidCastException ex) 
     { 
      return new GridLength(0, GridUnitType.Auto); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value is GridLength ? ((GridLength)value).Value : 0; 
    } 
相關問題