[英]<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.