[解決済み] WPFのDataGridColumnのバインディングの可視性
質問
WPFのカラムを隠すにはどうしたらよいでしょうか。
DataGrid
にある列をバインディングで隠すことはできますか?
これは私がやったことです。
<DataGridTextColumn Header="Column header"
Binding="{Binding ColumnValue}"
Width="100"
ElementStyle="{StaticResource DataGridRightAlign}"
Visibility="{Binding MyColumnVisibility}" />
そして、これは私が得たものです(列がまだ表示されている以外に)。
System.Windows.Data Error: 2 : ターゲット要素に対して、統治された FrameworkElement または FrameworkContentElement を見つけることができません。BindingExpression:Path=MyColumnVisibility; DataItem=null; target element is 'DataGridTextColumn' (HashCode=1460142); target property is 'Visibility' (type 'Visibility').
バインディングを修正する方法は?
どのように解決するのですか?
まず最初に
DataGridTextColumn
(または他のサポートされた dataGrid カラム) の Visual ツリーにはありません。
DataGrid
. したがって、デフォルトでは
を継承しません。
DataContext
の
DataGrid
. しかし、それは
Binding
DPのみで、DataGridColumnの他のDPでは動作しません。
これらは同じVisualTreeに存在しないため、どのような試みでも
DataContext
を使用して
RelativeSource
ではうまくいきません。
DataGridTextColumn
までトラバースすることができないからです。
DataGrid
.
この他にも2つの方法がありますが。
最初の
を使って
Freezable
クラスを使っています。
Freezable
オブジェクトは、視覚的または論理的なツリーにない場合でもDataContextを継承することができます -我々はそれを利用することができます。
まず、DataContextを継承したクラスを作成します。
Freezable
と
Data
というように、XAMLでバインドするために使用することができるDP。
public class BindingProxy : Freezable
{
#region Overrides of Freezable
protected override Freezable CreateInstanceCore()
{
return new BindingProxy();
}
#endregion
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object),
typeof(BindingProxy));
}
さて、DataGridのリソースにそのインスタンスを追加して、DataGridのDataContextを継承して、そのData DPとバインドできるようにします。
<DataGrid>
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Data.MyColumnVisibility,
Source={StaticResource proxy}}"/>
</DataGrid.Columns>
</DataGrid>
第二
を使用すると、XAMLで任意のUI要素を参照することができます。
ElementName
または
x:Reference
. しかし
ElementName
は同じビジュアルツリーの中でしか機能しませんが、x:Referenceにはそのような制約はありません。
というわけで、これも有利に使うことができます。ダミーの
FrameworkElement
を XAML で作成し、Visibility を
collapsed
. FrameworkElement は親コンテナ(Window または UserControl)から DataContext を継承します。
そして、DataGridでそれを使用することができます。
<FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Test"
Binding="{Binding Name}"
Visibility="{Binding DataContext.IsEnable,
Source={x:Reference dummyElement}}"/>
</DataGrid.Columns>
</DataGrid>
関連
-
[解決済み] WPFのテキストラップとWrapWithOverflowの比較
-
[解決済み] WPF: スクロールバー付きItemsControl (ScrollViewer)
-
[解決済み] テンプレートバインディングとバインディングとは?
-
[解決済み] WPFの星は何をしているのか(Width="100*")
-
[解決済み] WPF検証エラーの検出
-
[解決済み] WPFのテキストブロック、テキスト属性の改行について
-
[解決済み] wpfでスタイル/テンプレートを使用して小数点以下の桁数をフォーマットする方法は?
-
[解決済み] グリッドの行と列の位置をプログラムで設定する方法
-
[解決済み] WPFエラー。エラー: ターゲット要素に対応する FrameworkElement が見つかりません。
-
[解決済み] XAMLにおけるreadonlyプロパティからのOneWayToSourceバインディング
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
例外の解決方法 GDI+でジェネリックエラーが発生しました。
-
WPFバインディング(データバインディング)の使用方法
-
[解決済み] Windows 8 ランタイム(WinRT / Windowsストアアプリ / Windows 10 ユニバーサルアプリ)とSilverlightやWPFの比較はどうですか?[クローズド]
-
[解決済み] wpf: ボタンがコマンドによって無効にされたとき、ツールチップを表示する方法は?
-
[解決済み] グリッドカラムの幅・高さを設定する際の「Auto」と「*」の違いは何ですか?
-
[解決済み] データバインディングでWPFハイパーリンクのテキストを設定するにはどうすればよいですか?
-
[解決済み] レンダリング時間やパフォーマンスの面で最も効率的なパネルはどのような順番になりますか?
-
[解決済み] 読み取り専用のGUIプロパティをViewModelにプッシュバックする
-
[解決済み] WPFのページロードでコンボボックスにデフォルトテキスト"--Select Team -- "を表示するには?
-
[解決済み] WPFのバインディングモードにはどのようなものがありますか?