私はパラメータとしてブール値をとるカスタムビヘイビアを持っています。私はモデルのプロパティにバインドしようとしていますが、動作させることはできません。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>
私はこのトリックいくつかの時間を使用してきましたし、私はそれがこのシナリオでは、あまりにもなく動作します知っています。今、私は数時間の検索の後でこれに取り組んでいるので、どんな助けも大歓迎です。
は
確かにわかりませんが、おそらく 'HasLotPartie'は常にFalseですか? あなたのチェックを行い、AssociatedObjectのLoadedでイベントを登録するには、Behaviorで試してみてください。 おそらくOnAttachedにあるとき、Bindingはまだ現在の値を解決しません。 – Mishka
BindingProxyを使用すると効果があります。あなたはそれがどういうことを知っていますか? – mm8
@Mishka私は私のモデルで 'HasLotPartie'がtrueに設定されているが、ビヘイビアがfalseであるブール値のデフォルト値をとるように動作していないことをデバッガにチェックしました。 AssociatedObject.Loadedにイベントを登録しようとしましたが、そこに運がありません。 – Hugo