0

Visibilityプロパティが親ExpanderコントロールのIsExpandedにバインドされているGridがあります。

Grid.Visibilityが変更されるたびに、それに応じてDataContext (ビュー モデル)のプロパティ ( MyProperty )を変更する必要があります。

これは私のXAMLです:

<Grid Visibility="{Binding IsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Converter={StaticResource BoolToVisibilityConverter}}" />

以下を使用して、ビューコンストラクターでバインディングをプログラムで設定しようとしました。

grid.SetBinding(VisibilityProperty, new Binding("MyProperty") { Source = DataContext });

ただし、これは XAML で既に設定されているExpanderへのバインディングを置き換えるだけです。

これをひっくり返して、ターゲットがビューモデルでソースが代わりにグリッドになるようにし ( Visibilityにバインド)、MyPropertyを依存関係プロパティにすることを検討しました。しかし、私のビュー モデルはDependencyObjectではないため、これを行うことはできません。

MultiBinding / MultiConverterバインディングGrid.VisibilityExpander.IsExpandedおよびMyPropertyに使用しようとしましたが、これには目的の効果がありません。Expander.IsExpandedの変更の結果としてGrid.Visibilityが更新された場合、MyPropertyはGrid.Visibilityに変更されません。

機能しているように見える唯一のオプションは、 Expander.IsExpandedにバインドするGridの添付プロパティを使用し、コールバック関数を使用して、添付プロパティが変更されるたびにGrid.Visibilityをプログラムで変更することです。次にGrid.VisibilityがMyPropertyにバインドされます。これは面倒な方法のように思えますが、私は提案を受け付けています。

私がやろうとしているのは、2 つのバインディングが反対方向にある 2 つのバインディングのようなもので、1 つは依存関係プロパティからのもので、もう 1 つは CLR プロパティへのものであると思います。

与えられることができるどんな助けにも感謝します!!

4

1 に答える 1

0

エキスパンダーのトリガーを使用してグリッドの可視性を設定し、grid.VisibilityをViewModelにバインドできると思います。このアプローチは、コードビハインドを使用するソリューションに似ていますが、コードの代わりにトリガーを使用します。

私の意見では、コードビハインドを使用したソリューションでも十分です。すべてがコードビハインドではなくXAMLである必要があると誰が言ったのか。コードビハインドは通常、ビジネスロジックなどには適していませんが、XAMLのみで表現できない場合は、コードビハインドにビジュアルロジックを含めることはまったく問題ありません。

于 2012-03-30T10:58:43.990 に答える