簡體   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