2016-06-21 4 views
1

私はMVFプロジェクトのためのアセンブリをWPFで作成しました。私のアセンブリでは、私はデータグリッドの列をソートするときにアクティブにするための動作があります。MVVM別のアセンブリでの動作

行動だから、それは私のファイルが同じアセンブリにある場合にのみ正常に動作します

public class SortColumn : Behavior<DataGrid> 
{ 
    public string Property = ""; 
    public bool MeaningSort = true; 


    public static DependencyProperty AtSortingColumnCommandProperty = DependencyProperty.RegisterAttached(
      "AtSortingColumnCommand", typeof(ICommand), 
      typeof(SortColumn)); 
    public static ICommand GetAtSortingColumnCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(AtSortingColumnCommandProperty); 
    } 

    public static void SetAtSortingColumnCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(AtSortingColumnCommandProperty, value); 
    } 
    protected override void OnAttached() 
    { 
     AssociatedObject.Sorting += AssociatedObject_Sorting; 
     base.OnAttached(); 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.Sorting -= AssociatedObject_Sorting; 
     base.OnDetaching(); 
    } 

    //Selon MeaningSort, on renvoie une chaine OrderBy en ASC ou DESC 
    //Ex: MonChamp ASC 
    private void AssociatedObject_Sorting(object sender, DataGridSortingEventArgs e) 
    { 
     FrameworkElement element = (FrameworkElement)sender; 
     string FiledName = e.Column.SortMemberPath; 

     if (Property == null || (Property != FiledName && MeaningSort != false)) 
     { 
      e.Column.SortDirection = ListSortDirection.Ascending; 
      MeaningSort = false; 

      var atEnd = GetAtSortingColumnCommand(element); 
      if (atEnd != null) 
      { 
       atEnd.Execute(FiledName + " ASC"); 
      } 
     } 
     else 
     { 
      e.Column.SortDirection = ListSortDirection.Descending; 
      MeaningSort = true; 

      var atEnd = GetAtSortingColumnCommand(element); 
      if (atEnd != null) 
      { 
       atEnd.Execute(FiledName + " DESC"); 
      } 
     } 


    } 
} 

そして、私のXAMLで

<D:DataGridTemplate x:Name="Datagrid" 
         TablePaged:ScrollViewerMonitor.AtEndCommand="{Binding LoadCommand}" 
         TablePaged:SortColumn.AtSortingColumnCommand="{Binding SortingColumnCommand}" 
         Grid.Column="0" Grid.Row="1" Grid.RowSpan="2" ItemsSource="{Binding DataProduits,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 

をSortColumn。多分、私は同じインスタンスにいませんか?動作の取り付け

答えて

3

は非常に直感的であり、そして以下のように行われるべきである:

1)文書ヘッダーの次のxmlns

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

2を含む)における動作のxmlns定義以下のように要素に動作を添付)

xmlns:b="clr-namespace:MyAssembly.MyBehaviors;assembly=MyAssembly" 

3(また、文書ヘッダで)常駐:

<Element> 
    <i:Interaction.Behaviors> 
    <b:MyBehavior MyDependencyProperty={Binding Foo}> 
    </i:Interaction.Behaviors> 
</Element> 

限り、あなたは次の手順を実行していること、動作が付着するが、これを気にします:

行動は添付するためには、行動が接続されている要素は、のサブクラスでなければなりません(ジェネリックビヘイビアベースクラスを使用している場合は、ビヘイビアのジェネリックパラメータで指定されたタイプ)。あなたは非ジェネリック行動基本クラスを使用している場合

また、それはのDependencyObjectのサブクラスでなければなりません。

EDIT 1:

添付プロパティは、あなたの行動にはなく、いくつかのTargetTypeに登録されている間、あなたが実装動作がDataGridのある、まだあなたのXAMLはDataGridTemplateクラスにそれを取り付けた、すべてこの...それは本当に

EDIT 2 ...あらゆる場所にいるようだ:

あなたが既に取った場合は、一種のサブクラス化行動が無意味になり添付行動アプローチ..

を取ったようですの動作をサブクラス化する場合は、これらのプロパティを定期的な依存関係プロパティにすることもできます。

0

ありがとうございます!あなたのアドバイスのおかげで、私は問題を解決することができました。コードに続くコードは別のアセンブリから完全に動作します

public class SortColumn 
{ 
    public static string Property = ""; 
    public static bool MeaningSort = true; 


    public static DependencyProperty AtSortingColumnCommandProperty = DependencyProperty.RegisterAttached("AtSortingColumnCommand", 
     typeof(ICommand), typeof(SortColumn), new PropertyMetadata(OnAtSortingColumnCommandChanged)); 

    public static ICommand GetAtSortingColumnCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(AtSortingColumnCommandProperty); 
    } 

    public static void SetAtSortingColumnCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(AtSortingColumnCommandProperty, value); 
    } 

    public static void OnAtSortingColumnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var myDataGrid = d as DataGrid; 
     if (myDataGrid != null) 
     { 
      myDataGrid.Sorting -= HandleColumnSorting; 
      myDataGrid.Sorting += HandleColumnSorting; 
     } 
    } 

    static void HandleColumnSorting(object sender, DataGridSortingEventArgs e) 
    { 
     var myDataGridSorting = sender as DataGrid; 
     string FiledName = e.Column.SortMemberPath; 

     if (Property == null || (Property != FiledName && MeaningSort != false)) 
     { 
      e.Column.SortDirection = ListSortDirection.Ascending; 
      MeaningSort = false; 

      var atEnd = GetAtSortingColumnCommand(myDataGridSorting); 
      if (atEnd != null) 
      { 
       atEnd.Execute(FiledName + " ASC"); 
      } 
     } 
     else 
     { 
      e.Column.SortDirection = ListSortDirection.Descending; 
      MeaningSort = true; 

      var atEnd = GetAtSortingColumnCommand(myDataGridSorting); 
      if (atEnd != null) 
      { 
       atEnd.Execute(FiledName + " DESC"); 
      } 
     } 
    } 
} 
+0

あなたは大歓迎です! –

関連する問題