繁体   English   中英

<Dependency>财产已被注册<type>

[英]<Dependency> Property was already registered by <type>

我知道这个问题已经被很多人问到了。 我也得到了答案。 但是以某种方式,我创建的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>

初始化属性时出现以下错误:-[清单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上搜索后,我发现应该按如下所示声明属性[清单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的错误消失了,但是我无法以我的样式(在其中设置名为“ PART_FilterContainer”的Grid的可见性)中获得属性DoNotGenerateFilterControl的值(在Style中)。

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

这是我第一次在StackOverflow上发布问题。 因此,请原谅我发布了完整的代码。

这可能是一种解决方法:也许您可以在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>

由于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}}">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM