2010-09-03 57 views
1

我有以下XAML:遇到問題綁定ContentPresenter的能見度WPF

<UserControl.Resources> 

<DataTemplate x:Key="ExpanderTemplate"> 
    <Grid> 
     <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" /> 
     <Rectangle Stroke="Black" StrokeThickness="1" Width="6" Height="1" Fill="Black" /> 
     <Rectangle Stroke="Black" StrokeThickness="3" Width="2" Height="6" Fill="Black" /> 
    </Grid> 
</DataTemplate> 

<DataTemplate x:Key="CollapserTemplate"> 
    <Grid> 
     <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" /> 
     <Rectangle Stroke="Black" StrokeThickness="1" Width="6" Height="1" Fill="Black" /> 
    </Grid> 
</DataTemplate> 

</UserControl.Resources> 

<Grid> 
<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Path=Name}" /> 
    <Grid> 
     <ContentPresenter x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" /> 
     <ContentPresenter x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" /> 
    </Grid> 
</StackPanel> 
</Grid> 

正如你所看到的,它本質上是與它的內容綁定到一個名字,並有自己的知名度2個contentpresenters一個文本塊綁定到源類的幾個Visibility對象。源類看起來像這樣:

public class MyViewModel 
{ 
public string Name { get; set; } 

public Visibility CollapserVisibility 
{ 
    get 
    { 
     if (IsExpandable && IsExpanded) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed; 
     } 
    } 
} 

public Visibility ExpanderVisibility 
{ 
    get 
    { 
     if (IsExpandable && !IsExpanded) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed; 
     } 
    } 
} 

public bool IsExpanded { get; set; } 
public bool IsExpandable { get; set; } 
} 

我遇到的問題是,與可見性對象的綁定甚至不會發生。與名稱字符串的綁定確實發生了,並且我已驗證(可視化和擴展並在getter中放置斷點),但是當我在CollapserVisibility和ExpanderVisibility對象的getter中放置斷點時,那些斷點永遠不會甚至會受到打擊。爲什麼是這樣?我也沒有在Visual Studio的輸出窗口中得到任何綁定錯誤,這進一步使我感到困惑,所以它就好像綁定設置正確一樣。

我不允許綁定ContentPresenter的Visibility屬性嗎?我還嘗試將可見性綁定移動到數據模板(在XAML中)的「網格」對象上,但無濟於事......它無法工作。

我的綁定有什麼問題?謝謝你的幫助。

回答

1

您是否曾經將任何內容放入contentpresenter?它可能沒有顯示任何內容,因爲沒有任何內容可以顯示。數據模板決定數據的外觀,但您首先需要將數據真正放入數據中。

除此之外,綁定看起來應該用於初始值,但如果IsExpandable或IsExpanded屬性更改,它們將不會更新。

使用MultiDataTrigger控制可視性可能會好很多。

+0

嗯我的印象是,我可以定義ContentTemplate並在這些模板中獲取UI,即使沒有專門定義Content屬性也可以顯示。無論如何,我嘗試從數據模板中取出Grid對象,然後將它們原樣放入UserControl.Resources中,然後我將Content屬性定義爲使用它們作爲靜態資源,並且它可以工作。所以謝謝你的建議。 至於可見性的更新,是的,我知道。我將在這些事情上實現INotifyPropertyChanged,我只是試圖讓綁定工作在第一位。 – David 2010-09-03 16:04:59

9

如果你改變了ContentPresenterContentControl它工作(因爲它綁定到你的知名度屬性 - 我忽略了一個事實,你的虛擬機不更改通知):

<ContentControl x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" /> 
<ContentControl x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" /> 

我真的除了ContentPresenter應該在ContentControl的模板中使用這一事實之外,無法解釋這是爲什麼。但是,對我來說,它應該仍然有效。我認爲這需要一些基於反射器的偵查來確定這一點。

0

顯然這不是你的答案,但其他人可能會覺得這很有用。

如果你綁定到一個布爾,不要忘記包括布爾可見性轉換器。

..., Converter={StaticResource BoolToVis}}"