2011-07-22 197 views
1

我開發了一個自定義數據網格控件。這個控件有兩個部分,一個是數據網格本身使用的自定義模板,另一個是我的自定義控件,它爲數據網格添加了標題區域。資源字典的WPF綁定問題

我有一個名爲CustomDataGrid的類,這裏是XAML。

<UserControl x:Class="MDT_Designer.Presentation.ScreenControls.CustomDataGrid" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     Name="CDataGrid" > 
<UserControl.Resources> 
    <ResourceDictionary x:Key="Dictionary" Source="CustomizedControls.xaml"/> 
</UserControl.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="{Binding ElementName=CDataGrid, Path=TitleAreaHeight}"/> 
     <RowDefinition Height="{Binding ElementName=CDataGrid, Path=GridAreaHeight}"/> 
    </Grid.RowDefinitions> 
    <Grid Name="TitleArea" DockPanel.Dock="Top" Background="{Binding ElementName=CDataGrid, Path=TitleBackColor}" > 
     <Viewbox HorizontalAlignment="{Binding ElementName=CDataGrid, Path=TitleAlignment}"> 
      <TextBlock Name="TitleText" Text="{Binding ElementName=CDataGrid, Path=Title}" Margin="2,0,0,0" FontFamily="{Binding ElementName=CDataGrid, Path=TitleFontFamily}" Foreground="{Binding ElementName=CDataGrid, Path=TitleTextColor}"/> 
     </Viewbox> 
    </Grid> 
    <DataGrid Name="DataGridArea" Grid.Row="1" IsReadOnly="True" HorizontalGridLinesBrush="DarkGray" VerticalGridLinesBrush="DarkGray" VerticalScrollBarVisibility="Visible" Background="AliceBlue" > 
    </DataGrid> 
</Grid> 
</UserControl> 

在我的CustomDataGrid.xaml.cs文件中,我已經定義了屬性。

public static DependencyProperty TitleAlignmentProperty = DependencyProperty.Register("TitleAlignment", typeof(HorizontalAlignment), typeof(CustomDataGrid)); 
    public HorizontalAlignment TitleAlignment 
    { 
     get { return (HorizontalAlignment)base.GetValue(TitleAlignmentProperty); } 
     set { base.SetValue(TitleAlignmentProperty, value); } 
    } 

我只是顯示一個作爲示例,這個工程。我希望我可以改變XAML中的綁定來擺脫ElementName = CDataGrid,但是我作爲替代方法的任何方式都不起作用。

現在我的問題。數據網格控件本身的自定義模板存儲在字典CustomizedControls.xaml中。

以下是綁定問題的一個示例。我必須創建這個資源。

<LinearGradientBrush x:Key="HeaderBackgroundBrush" EndPoint="0.5,1" StartPoint="0.5,0" > 
    <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlLightColorKey}}" Offset="0" /> 
    <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlDarkColorKey}}" Offset="1" /> 
</LinearGradientBrush> 

然後,我將它用在列標題的邊框定義中。

<Style TargetType="{x:Type DataGridColumnHeader}"> 
    <Setter Property="VerticalContentAlignment" Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
       <Grid> 
        <Border x:Name="columnHeaderBorder" BorderThickness="1" Padding="3,0,3,0" 
      Background="{DynamicResource HeaderBackgroundBrush}"> 
          <Border.BorderBrush> 
          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
           <GradientStop Color="{DynamicResource BorderLightColor}" Offset="0" /> 
           <GradientStop Color="{DynamicResource BorderDarkColor}" Offset="1" /> 
          </LinearGradientBrush> 
         </Border.BorderBrush> 
         <ContentPresenter x:Name="columnHeaderPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Style="{DynamicResource HeaderContentStyle}" /> 
        </Border> 

        <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}" /> 
        <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

然後在我的代碼後面改變它,我必須這樣做。

 LinearGradientBrush headerBrush = (LinearGradientBrush)TryFindResource("HeaderBackgroundBrush"); 
     headerBrush.GradientStops[0] = new GradientStop(brush.Color, 0.0); 

我不能改變筆刷本身,我只能改變筆刷的屬性。我嘗試了所有我能想到的綁定技術,但是當樣式在字典中時似乎沒有任何作用。

我希望能夠做的是以某種方式綁定像BorderLightColor這是BorderBrush設置,以便在我的代碼後面我可以更改它的值。

任何幫助會讓我的一天,它會讓我整個週末事實上。謝謝。

回答

0

爲什麼不能改變畫筆?您應該能夠將刷子參考分配給控件。這不行嗎? FindResource應搜索您在其上調用它的FrameworkElement的父元素,然後搜索樹,應用程序資源,然後搜索以系統資源結尾的主題。請原諒我的VB ...

Private Sub Button_Click(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs) 
    Dim MyBrush2 as Brush = Me.FindResource("Brush2") 
    Me.MyRect.Background = MyBrush2 
End Sub 

,窗口內容:

<Window.Resources> 
    <LinearGradientBrush x:Key="Brush1" EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="Black" Offset="0"/> 
     <GradientStop Color="White" Offset="1"/> 
    </LinearGradientBrush> 
    <LinearGradientBrush x:Key="Brush2" EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="#FF0800FF" Offset="0"/> 
     <GradientStop Color="Red" Offset="1"/> 
    </LinearGradientBrush> 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <Grid x:Name="MyRect" HorizontalAlignment="Left" Margin="63,66,0,174" Width="242" Background="{DynamicResource Brush1}" /> 
    <Button Content="Button" HorizontalAlignment="Right" Height="60" Margin="0,117,95,0" VerticalAlignment="Top" Width="156" Click="Button_Click"/> 
</Grid> 
+0

我有點糊塗了您的迴應。我想要做的是通過樣式改變與控件綁定的筆刷。 Perhapss我只需要始終創建並以編程方式分配畫筆,而不必打擾使用綁定。我會試試這個。 – WPFNewbie

+0

我的另一個大問題是來自字典的綁定。我無法綁定到在字典中定義的任何屬性。如果我在UserControl.Resources部分中定義一個樣式,我可以將它綁定到代碼中顯示的DepandancyProperty,並在後面的代碼中對其進行操作。但是,我將這種相同的樣式移動到字典中,我看起來不會將其綁定到我的代碼中定義的depandancy屬性。我很想把所有東西都移出字典,所以它會起作用,但我真的很想知道我做錯了什麼,或者錯過了什麼。 – WPFNewbie

+0

如果它是您遇到問題的樣式,您可以在UserControl.Resources中始終創建一個空的樣式,並根據其他地方的資源創建樣式。然後它會反映出其他風格,但是可以在UserControl中定義。對ResourceDictionary版本的更改將繼續。 – CodeWarrior