2017-04-05 29 views
1

私はパラメータとしてブール値をとるカスタムビヘイビアを持っています。私はモデルのプロパティにバインドしようとしていますが、動作させることはできません。WPFビヘイビアプロパティへのバインドが機能しません。

public partial class GridView : UserControl 
{ 
    public GridView(ArticleViewModel a) 
    { 
     InitializeComponent(); 
     this.DataContext = a;   
    }   
} 

私のViewModel:

public class ArticleViewModel : INotifyPropertyChanged 
{ 

    private Cahier cahierDesCharges; 
    public Cahier CahierDesCharges { get { return cahierDesCharges; } set { } } 

    private ObservableCollection<Article> articles; 
    public ObservableCollection<Article> Articles 
    { 
     get { return articles; } 
     set { articles = value; OnPropertyChanged("articles"); } 
    } 

    public ArticleViewModel() { } 

    public ArticleViewModel(Cahier c) 
    { 
     this.cahierDesCharges = c; 
     this.articles = CahierDesCharges.Articles; 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, 
       new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 

    } 
} 

そして

<dxg:GridControl 
     x:Name="dgArticles" 
     Grid.Row="1" 
     AutoGenerateColumns="None" 
     ItemsSource="{Binding Path=Articles, Mode=TwoWay}"> 

     <dxmvvm:Interaction.Behaviors> 
      <util:ExpandAllBehavior HasLotPartie="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.CahierDesCharges.HasLotPartie }" /> 
     </dxmvvm:Interaction.Behaviors> 


    </dxg:GridControl 

これはWPFユーザーコントロールで、DataContextのは、次のようにコードビハインドで定義されている(私はDevExpress社使用しています) CahierDesチャージクラス:

public class Cahier : INotifyPropertyChanged 
{ 
    public bool HasLotPartie { get; set; } 

    private ObservableCollection<Article> articles; 
    public ObservableCollection<Article> Articles 
    { 
     get { return articles; } 
     set { articles = value; OnPropertyChanged("articles"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public Cahier() { } 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, 
       new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     Console.WriteLine(propertyName); 
    } 
} 

行動:

public class ExpandAllBehavior : Behavior<GridControl> 
{ 
    public static readonly DependencyProperty HasLotPartieProperty = 
    DependencyProperty.Register("HasLotPartie", typeof(Boolean), typeof(ExpandAllBehavior)); 
    public bool HasLotPartie 
    { 
     get { return (bool)GetValue(HasLotPartieProperty); } 
     set { SetValue(HasLotPartieProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     if (HasLotPartie) 
     { 
      base.OnAttached(); 

      this.AssociatedObject.CustomRowFilter += AssociatedObject_Loaded; 
     } 

    } 

    void AssociatedObject_Loaded(object sender, EventArgs e) 
    { 
     int dataRowCount = AssociatedObject.VisibleRowCount; 
     for (int rowHandle = 0; rowHandle < dataRowCount; rowHandle++) 
      AssociatedObject.ExpandMasterRow(rowHandle); 


    } 



    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
    } 
} 

私は別の場所でライン"{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.CahierDesCharges.HasLotPartie }"を使用していると私はそれが働いている知っています。次の例では、それは完全に罰金働いています:

<dxg:GridControl.View> 
      <dxg:TableView 
       AllowScrollAnimation="True" 
       EnableImmediatePosting="True" 
       IsDetailButtonVisibleBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.CahierDesCharges.HasLotPartie }" 
       Name="view" 
       ShowGroupedColumns="False" 
       ShowGroupPanel="False" 
       UseLightweightTemplates="None" /> 
     </dxg:GridControl.View> 

私は手動で値をtrueに設定した場合、動作は正常に動作します:<util:ExpandAllBehavior HasLotPartie="True" />は、だから私はそれがDadaContextが継承されていないことかもしれないと思ったが、私はで説明トリックを使用トーマス・レベスク彼のブログhereに、これは私が得たものである:

<dxg:GridControl.Resources>    
      <util:BindingProxy x:Key="proxy" Data="{Binding}" /> 
     </dxg:GridControl.Resources> 
     <dxmvvm:Interaction.Behaviors> 
      <util:ExpandAllBehavior HasLotPartie="{Binding Data.CahierDesCharges.HasLotPartie, Source={StaticResource proxy}}" /> 
     </dxmvvm:Interaction.Behaviors> 

私はこのトリックいくつかの時間を使用してきましたし、私はそれがこのシナリオでは、あまりにもなく動作します知っています。今、私は数時間の検索の後でこれに取り組んでいるので、どんな助けも大歓迎です。

+0

確かにわかりませんが、おそらく 'HasLotPartie'は常にFalseですか? あなたのチェックを行い、AssociatedObjectのLoadedでイベントを登録するには、Behaviorで試してみてください。 おそらくOnAttachedにあるとき、Bindingはまだ現在の値を解決しません。 – Mishka

+0

BindingProxyを使用すると効果があります。あなたはそれがどういうことを知っていますか? – mm8

+0

@Mishka私は私のモデルで 'HasLotPartie'がtrueに設定されているが、ビヘイビアがfalseであるブール値のデフォルト値をとるように動作していないことをデバッガにチェックしました。 AssociatedObject.Loadedにイベントを登録しようとしましたが、そこに運がありません。 – Hugo

答えて

0

[OK]をありがとう私は行動が呼び出されたときに、私のCahierDesChargesがnullであったことを考え出しました。したがって、HasLotPartieは何があっても間違っていたので、私のイベントには届きませんでした。だから私はちょうどAssociatedObject_Loadedメソッドで私のif()を移動し、それは働いた。 GridControlが完全にロードされるまで待つ必要があったので、CahierDesChargesはもうnullではありませんでした。 これが今の私の行動クラスです:HasLotPartieが望む効果あった真のとき

public class ExpandAllBehavior : Behavior<GridControl> 
{ 
    public static readonly DependencyProperty HasLotPartieProperty = 
    DependencyProperty.Register("HasLotPartie", typeof(bool), typeof(ExpandAllBehavior)); 

    public bool HasLotPartie 
    { 
     get { return (bool)GetValue(HasLotPartieProperty); } 
     set { SetValue(HasLotPartieProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     this.AssociatedObject.Loaded += AssociatedObject_Loaded; //Apllied after GridControl is fully loaded. 
     this.AssociatedObject.CustomRowFilter += AssociatedObject_Loaded; //Applied after filtering on Rows 
    } 

    void AssociatedObject_Loaded(object sender, EventArgs e) 
    { 
     if (HasLotPartie) 
     { 
      int dataRowCount = AssociatedObject.VisibleRowCount; 
      for (int rowHandle = 0; rowHandle < dataRowCount; rowHandle++) 
       AssociatedObject.ExpandMasterRow(rowHandle); 
     } 
    } 



    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
    } 
} 

は今私のMasterDetailsは常に拡大しています。 いつものように、私は複雑なものに焦点を絞っていましたが、解決は簡単でした。

関連する問題