2015-10-23 64 views
0

我正試圖爲我的ComboBoxes實現一個水印解決方案,我在網上找到了某處(我找不到該頁面),但遇到綁定問題。原來的解決方案有靜態文本,我想用ComboBoxes Tag屬性的綁定替換。WPF綁定樣式。觸發父項

這是我到目前爲止有:

<Grid> 
     <Grid.Resources> 
      <VisualBrush x:Key="Watermark" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left"> 
       <VisualBrush.Visual> 
        <TextBlock FontStyle="Italic" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=Tag}"/> 
       </VisualBrush.Visual> 
      </VisualBrush> 
      <Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}"> 
       <Setter Property="Margin" Value="5"/> 
       <Setter Property="IsEditable" Value="False"/> 
       <Setter Property="IsReadOnly" Value="True"/> 
       <Style.Triggers> 
        <Trigger Property="Text" Value=""> 
         <Setter Property="Background" Value="{DynamicResource Watermark}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Grid.Resources> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <ComboBox Grid.Column="0" ItemsSource="{Binding Categories}" Tag="Categories"/> 
     <ComboBox Grid.Column="1" ItemsSource="{Binding SubCategories}" Tag="SubCategories"/> 
     <ComboBox Grid.Column="2" ItemsSource="{Binding Whatever}" Tag="Whatever"/> 

不幸的是,它看起來像 「FindAncestor」 部分不能正常工作。 誰能告訴我爲什麼?

提前致謝!

回答

0

恐怕不是那麼容易。

首先,您不能設置像這樣的ComboxBoxBackground屬性。很明顯,只要您嘗試用某些硬編碼文本替換RelativeSource-Binding。其次,您必須確保VisualBrush資源是您的ComboBox的VisualTree的一部分,而不是其他地方(例如,包含Grid)。

這兩個問題都可以通過重新設計ComboBox來解決。這可以通過首先創建一個新模板(作爲副本)在Blend或Visual Studio中完成。然後你需要改變一下。

將會有一個名爲「templateRoot」的Grid。添加您的水印的ressource:

<Grid x:Name="templateRoot" SnapsToDevicePixels="True"> 
    <Grid.Resources> 
     <VisualBrush x:Key="Watermark" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left"> 
      <VisualBrush.Visual> 
       <TextBlock FontStyle="Italic" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=Tag}"/> 
      </VisualBrush.Visual> 
     </VisualBrush> 
    </Grid.Resources> 
    <Grid.ColumnDefinitions>... 

然後,在<ControlTemplate.Triggers>部分結束時,您需要插入另一MultiDataTrigger

<MultiDataTrigger> 
    <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="" /> 
    </MultiDataTrigger.Conditions> 
    <Setter Property="Background" TargetName="templateRoot" Value="{DynamicResource Watermark}"/> 
</MultiDataTrigger> 

它必須是一個MultiTrigger條件,否則它不綁定。

+0

我不明白你的第一點,因爲如果我用一些硬編碼文本替換RelativeSource-Binding,它確實有效......? – MemphiZ

+0

對我來說不。如果重要,你應該發佈一個完整的示例進行演示。 – JeffRSon

+0

哈哈,現在這很有趣。我創建了一個沒有顯示水印的示例項目。在添加MahApps.Metro nuget包並調整App.xaml中的樣式後,它可以工作。他們必須以某種方式實施這種行爲。不幸的是,我仍然無法將綁定映射到組合框的標籤屬性。無論如何,你可以在這裏找到解決方案:https://www.dropbox.com/s/eb219vbqdo2co45/WpfApplication1.7z?dl=1 – MemphiZ