我知道许多人已经提出过这个问题。我也得到了答案。但不知何故,我创建的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上发帖提问。所以请原谅我发布的整个代码。
答案 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}}">