2016-09-13 10 views
0

Window에 두 개의 DataGrid가 있고 열 머리글에 필터를 만드는 데 Blend 비헤이비어를 사용하고 있습니다.비공개 WPF 비헤이비어

<DataGrid> 
    <i:Interaction.Behaviors> 
    <v:ColumnBehavior/> 
    </i:Interaction.Behaviors> 
</DataGrid> 
<DataGrid> 
    <i:Interaction.Behaviors> 
    <v:ColumnBehavior/> 
    </i:Interaction.Behaviors> 
</DataGrid> 

문제는,이 동작의 예는 모두 DataGrids를 위해 어떻게 든 일반적이다, 그래서 당신이 첫 번째 데이터 그리드에 필터를 설정하면, 그것은 그 반대의 두 번째 데이터 그리드에 자동으로 설정됩니다. 나는이 필터 (행동)를 독립적으로 가질 필요가있다. 내가 읽은 것에서는 스타일을 가지고 성취 할 수 없습니다.

행동 클래스 :

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 
+1

제발 행동 코드를 게시 할 수 있습니까? 이 동작에서 정적 값을 사용하고있는 것 같습니다. – ibebbs

+0

행동 코드를 추가했습니다. 나는 아무것도 정적이라고 생각하지 않는다. –

답변

0

문제가 해결된다. 행동 클래스의 인스턴스는 두 가지가 있지만, 두 인스턴스 모두 viewmodel의 동일한 속성에 바인딩되어 있습니다 ...