<dependency>属性已由<type> </type> </dependency>注册

时间:2015-04-14 05:39:25

标签: c# .net wpf

我知道许多人已经提出过这个问题。我也得到了答案。但不知何故,我创建的DP在我的风格中没有正确设置。 这是我的代码。 [清单-1]

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style TargetType="{x:Type local:DataGridColumnFilter}">

        <Style.Resources>                               

            <local:BooleanToHeightConverter x:Key="booleanToHeightConverter" />
            <local:FontSizeToHeightConverter x:Key="fontSizeToHeightConverter" />       
            <local:MyOppositeBooleanToVisibilityConverter x:Key="oppositeBooleanToVisibilityConverter" />
            <local:ClearFilterButtonVisibilityConverter x:Key="clearFilterButtonVisibilityConverter" />

            <Style TargetType="{x:Type local:DelayTextBox}">
                <Setter Property="Background" Value="AliceBlue" />
            </Style>
        </Style.Resources>

        <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Self}, Path=IsControlInitialized, Converter={StaticResource booleanToHeightConverter}}"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:DataGridColumnFilter}">

                    <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">

                        <Grid Name="PART_FilterContainer"
                          Visibility="{Binding Path=AssignedDataGridColumn.DoNotGenerateFilterControl, RelativeSource={RelativeSource AncestorType={x:Type local:DataGridColumnFilter}}, Converter={StaticResource oppositeBooleanToVisibilityConverter}}"
                              >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>

                            <!-- Clear Filter Button -->
                            <Button 
                            VerticalAlignment="Top" 
                            Height="{Binding 
                                    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
                                    Converter={StaticResource fontSizeToHeightConverter},
                                    Path=FontSize}"
                            ToolTip="Clear filter" 

                            Command="{Binding Path=(local:DataGridExtensions.ClearFilterCommand), RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"

                            Grid.Column="0" Name="PART_ClearFilterButton">

                                <Button.Content>
                                    Clear filter
                                </Button.Content>

                                <Button.Visibility>
                                    <MultiBinding Converter="{StaticResource clearFilterButtonVisibilityConverter}">
                                        <Binding Path="IsFirstFilterControl" RelativeSource="{RelativeSource TemplatedParent}"/>
                                        <Binding Path="(local:DataGridExtensions.IsClearButtonVisible)" RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}"/>
                                    </MultiBinding>

                                </Button.Visibility>

                            </Button>
                            <!-- Clear Filter Button -->

                            <!-- Numeric and Text--> 

                            <local:DelayTextBox

                                Visibility="Collapsed"
                                VerticalAlignment="Top"
                                VerticalContentAlignment="Center"
                                Height="{Binding 
                                        RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
                                        Converter={StaticResource fontSizeToHeightConverter},
                                        Path=FontSize}"                                
                                 Text="{Binding 
                                    RelativeSource={RelativeSource AncestorType={x:Type local:DataGridColumnFilter}}, 
                                    Path=FilterCurrentData.QueryString,
                                    Mode=TwoWay,
                                    UpdateSourceTrigger=Explicit}"
                                    Grid.Column="2" Name="PART_TextBoxFilter">
                            </local:DelayTextBox> 
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsTextFilterControl" Value="true">
                            <Setter TargetName="PART_TextBoxFilter" Property="Visibility" Value="Visible"/>
                        </Trigger>
                    </ControlTemplate.Triggers>

                </ControlTemplate>
            </Setter.Value>

        </Setter>

    </Style>

    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Style.Resources>

            <local:BooleanToHeightConverter x:Key="booleanToHeightConverter" />
            <local:FontSizeToHeightConverter x:Key="fontSizeToHeightConverter" />
            <local:MyOppositeBooleanToVisibilityConverter x:Key="oppositeBooleanToVisibilityConverter" />
            <local:ClearFilterButtonVisibilityConverter x:Key="clearFilterButtonVisibilityConverter" />

            <!--<Style TargetType="{x:Type local:DelayTextBox}">
                <Setter Property="Background" Value="AliceBlue" />
            </Style>-->
        </Style.Resources>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>

                        <local:DataGridColumnFilter Margin="1" Grid.Column="0" Grid.Row="0"


                        FilterCurrentData ="{Binding 
                                RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}, 
                                Path=Tag, 
                                UpdateSourceTrigger=PropertyChanged,
                                Mode=TwoWay}"

                        AssignedDataGridColumnHeader ="{Binding 
                                RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}, 
                                Path=.}"

                        AssignedDataGridColumn ="{Binding 
                                RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}, 
                                Path=Column}"

                        DataGrid ="{Binding 
                                RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
                                Path=.}"   

                        DataGridItemsSource ="{Binding 
                                RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
                                Path=ItemsSource}"                        
                        >

                        </local:DataGridColumnFilter>


                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid>

    <DataGrid ItemsSource="{Binding ListOfStudents,Mode=TwoWay}"            
              >
        <DataGrid.Columns>

            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" local:DataGridColumnExtensions.DoNotGenerateFilterControl="True" 
                                />
            <DataGridTextColumn Header="Address" Binding="{Binding Path=Address}" local:DataGridColumnExtensions.DoNotGenerateFilterControl="true"
                                />
            <DataGridTextColumn Header="Tel" Binding="{Binding Path=Tel}"
                                />


        </DataGrid.Columns>
    </DataGrid>
</Grid>

初始化属性时出现错误,如下所示: - [Listing-2]

public class DataGridColumnExtensions
  {
    public static DependencyProperty IsCaseSensitiveSearchProperty =
        DependencyProperty.RegisterAttached("IsCaseSensitiveSearch",
            typeof(bool), typeof(DataGridColumn));

    public static bool GetIsCaseSensitiveSearch(DependencyObject target)
    {
        return (bool)target.GetValue(IsCaseSensitiveSearchProperty);
    }

    public static void SetIsCaseSensitiveSearch(DependencyObject target, bool value)
    {
        target.SetValue(IsCaseSensitiveSearchProperty, value);
    }

    public static DependencyProperty IsBetweenFilterControlProperty =
        DependencyProperty.RegisterAttached("IsBetweenFilterControl",
            typeof(bool), typeof(DataGridColumn));

    public static bool GetIsBetweenFilterControl(DependencyObject target)
    {
        return (bool)target.GetValue(IsBetweenFilterControlProperty);
    }

    public static void SetIsBetweenFilterControl(DependencyObject target, bool value)
    {
        target.SetValue(IsBetweenFilterControlProperty, value);
    }

    public static DependencyProperty DoNotGenerateFilterControlProperty =
        DependencyProperty.RegisterAttached("DoNotGenerateFilterControl",
            typeof(bool), typeof(DataGridColumn), new PropertyMetadata(false));

    public static bool GetDoNotGenerateFilterControl(DependencyObject target)
    {
        return (bool)target.GetValue(DoNotGenerateFilterControlProperty);
    }

    public static void SetDoNotGenerateFilterControl(DependencyObject target, bool value)
    {
        target.SetValue(DoNotGenerateFilterControlProperty, value);
    }

}

}

在StackOverflow上搜索后,我发现我应该声明属性如下[Listing-3]

 public class DataGridColumnExtensions
{
    public static DependencyProperty IsCaseSensitiveSearchProperty =
        DependencyProperty.RegisterAttached("IsCaseSensitiveSearch",
            typeof(bool), typeof(DataGridColumnExtensions));

    public static bool GetIsCaseSensitiveSearch(DependencyObject target)
    {
        return (bool)target.GetValue(IsCaseSensitiveSearchProperty);
    }

    public static void SetIsCaseSensitiveSearch(DependencyObject target, bool value)
    {
        target.SetValue(IsCaseSensitiveSearchProperty, value);
    }

    public static DependencyProperty IsBetweenFilterControlProperty =
        DependencyProperty.RegisterAttached("IsBetweenFilterControl",
            typeof(bool), typeof(DataGridColumnExtensions));

    public static bool GetIsBetweenFilterControl(DependencyObject target)
    {
        return (bool)target.GetValue(IsBetweenFilterControlProperty);
    }

    public static void SetIsBetweenFilterControl(DependencyObject target, bool value)
    {
        target.SetValue(IsBetweenFilterControlProperty, value);
    }

    public static DependencyProperty DoNotGenerateFilterControlProperty =
        DependencyProperty.RegisterAttached("DoNotGenerateFilterControl",
            typeof(bool), typeof(DataGridColumnExtensions), new PropertyMetadata(false));

    public static bool GetDoNotGenerateFilterControl(DependencyObject target)
    {
        return (bool)target.GetValue(DoNotGenerateFilterControlProperty);
    }

          public static void SetDoNotGenerateFilterControl(DependencyObject target, bool value)
    {
        target.SetValue(DoNotGenerateFilterControlProperty, value);
    }
}

然后来自XAML的错误消失但我无法获得我的样式中的属性DoNotGenerateFilterControl的值,我将其设置为名为“PART_FilterContainer”(格式)的Grid的可见性。

当我使用不正确的依赖属性代码[Listing-2]但是XAML抛出错误时,属性的值也应用于我的网格。

这是我第一次在StackOverflow上发帖提问。所以请原谅我发布的整个代码。

2 个答案:

答案 0 :(得分:0)

这可能是一种解决方法: 也许您可以在XAML中使用DataTrigger来控制网格的可见性。像这样:

<Grid Name="PART_FilterContainer">
   <Grid.Style>
      <Style TargetType="Grid">
          <Setter Property="Visibility" Value="Visible"/>
          <Style.Triggers>
             <DataTrigger Binding="{Binding Path=DoNotGenerateFilterControl, ElementName=WhatEverElement}" Value="True">
                <Setter Property="Visibility" Value="Collapsed"/>
             </DataTrigger>
          </Style.Triggers>
      </Style>
   </Grid.Style>
</Grid>

答案 1 :(得分:0)

由于DoNotGenerateFilterControl是附加属性,因此在绑定时应引用它。附加属性应括在括号中,而不是绑定到

AssignedDataGridColumn.DoNotGenerateFilterControl

你应该绑定到

AssignedDataGridColumn.(local:DataGridColumnExtensions.DoNotGenerateFilterControl)
<Grid Name="PART_FilterContainer"
      Visibility="{Binding Path=AssignedDataGridColumn.(local:DataGridColumnExtensions.DoNotGenerateFilterControl), RelativeSource={RelativeSource AncestorType={x:Type local:DataGridColumnFilter}}, Converter={StaticResource oppositeBooleanToVisibilityConverter}}">