0
私はWindow上に2つのDataGridを持っていますが、私は列ヘッダーにフィルタを作成するためにBlendの動作を使用しています。WPFの動作が公開されていません
<DataGrid>
<i:Interaction.Behaviors>
<v:ColumnBehavior/>
</i:Interaction.Behaviors>
</DataGrid>
<DataGrid>
<i:Interaction.Behaviors>
<v:ColumnBehavior/>
</i:Interaction.Behaviors>
</DataGrid>
問題は、あなたが最初のデータグリッドにフィルタを設定した場合、それは第二のDataGridとその逆に自動的に設定されているので、この動作のインスタンスは、両方のデータグリッドのために何らかの形で一般的である、です。私はこれらのフィルタ(ビヘイビア)を独立させる必要があります。私が読んだところから、スタイルで達成することは不可能です。
行動クラス:
Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Imports System.IO
Imports System.Text
Imports System.Windows.Controls.Primitives
Imports System.Windows.Interactivity
Imports System.Windows.Markup
Namespace View
Friend Class ColumnBehavior
Inherits Behavior(Of DataGrid)
Protected Overrides Sub OnAttached()
MyBase.OnAttached()
AddHandler AssociatedObject.AutoGeneratingColumn, AddressOf OnAutoGeneratingColumn
End Sub
Protected Sub OnAutoGeneratingColumn(sender As Object, e As DataGridAutoGeneratingColumnEventArgs)
If e.PropertyDescriptor IsNot Nothing Then
Dim descriptor = DirectCast(e.PropertyDescriptor, PropertyDescriptor)
Dim customString = DirectCast(descriptor.Attributes(GetType(CustomStringAttribute)), CustomStringAttribute)
If customString IsNot Nothing Then
Dim unitType = DirectCast([Enum].Parse(GetType(DataGridLengthUnitType), customString.Value), DataGridLengthUnitType)
e.Column.Width = New DataGridLength(1, unitType)
End If
Dim display = DirectCast(descriptor.Attributes(GetType(DisplayAttribute)), DisplayAttribute)
If display IsNot Nothing Then
e.Cancel = (Not display.GetAutoGenerateField().GetValueOrDefault(True))
e.Column.Header = display.GetShortName()
Dim headerStyle = e.Column.HeaderStyle
If headerStyle Is Nothing Then headerStyle = New Style(GetType(DataGridColumnHeader))
headerStyle.Setters.Add(New Setter(ToolTipService.ToolTipProperty, display.GetDescription()))
e.Column.HeaderStyle = headerStyle
If display.GetAutoGenerateFilter().GetValueOrDefault(False) Then
Dim comboBoxBinding = DirectCast(descriptor.Attributes(GetType(ComboBoxBindingAttribute)), ComboBoxBindingAttribute)
If comboBoxBinding IsNot Nothing Then
Dim bindingString = "{{Binding {0}, RelativeSource={{RelativeSource FindAncestor, AncestorType={{x:Type Window}}}}}}"
Dim dataTemplateXaml = <DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock
Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"
Margin="0,0,4,0"
VerticalAlignment="Center"
Grid.Column="0"/>
<ComboBox
IsReadOnly="True"
ItemsSource=<%= String.Format(bindingString, comboBoxBinding.ItemsSource) %>
SelectedItem=<%= String.Format(bindingString, comboBoxBinding.SelectedItem) %>
Grid.Column="1"
SelectedIndex="0"/>
</Grid>
</DataTemplate>
Dim headerTemplate As DataTemplate
Using dataTemplateReader As New MemoryStream(Encoding.UTF8.GetBytes(dataTemplateXaml.ToString()))
Dim context As New ParserContext
context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation")
context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml")
headerTemplate = DirectCast(XamlReader.Load(dataTemplateReader, context), DataTemplate)
End Using
e.Column.HeaderTemplate = headerTemplate
End If
End If
End If
Dim displayFormat = DirectCast(descriptor.Attributes(GetType(DisplayFormatAttribute)), DisplayFormatAttribute)
If displayFormat IsNot Nothing Then
DirectCast(e.Column, DataGridBoundColumn).Binding.StringFormat = displayFormat.DataFormatString
End If
End If
End Sub
Protected Overrides Sub OnDetaching()
MyBase.OnDetaching()
RemoveHandler AssociatedObject.AutoGeneratingColumn, AddressOf OnAutoGeneratingColumn
End Sub
End Class
End Namespace
あなたがデータグリッドにフィルタを自動作成するためにモデルの属性を使用します。
<Display(ShortName:="Meeting", Description:="Meeting code", AutoGenerateField:=True, AutoGenerateFilter:=True)>
<ComboBoxBinding("DataContext.MeetingCodes", "DataContext.TasksMeetingCodeFilter")>
<CustomString("SizeToCells")>
Public Property TaskMeetingCode As String Implements ITaskView.TaskMeetingCode
ビヘイビアコードを投稿できますか?この動作で静的な値を使用している可能性があります。 – ibebbs
ビヘイビアコードを追加しました。静的なものは何もないと思う。 –