web-dev-qa-db-ja.com

プログラムによるWPFバインディング

さまざまな理由により、このxamlバインディングをC#の対応するものに変換しようとしています。

<ListView x:Name="eventListView" Grid.Column="0" Grid.Row="1" Background="LightGray" BorderThickness="0">
    <local:EventCell x:Name="cell" Width="{Binding ActualWidth, Converter={StaticResource ListViewWidthConverter}, ElementName=eventListView, Mode=OneWay}"/>
</ListView>

私は同様の問題を抱えている多くの質問をすでに読んで、このコードを思いつきました:

Binding b = new Binding();
b.Source = eventListView;
b.Path = new PropertyPath(cell.Width);
b.Converter = new ListViewWidthConverter();
b.Mode = BindingMode.OneWay;
cell.SetBinding(ListView.ActualWidthProperty, b);

しかし、C#コードはコンパイルできません。その理由がわかりません。

18
xvpower

PropertyPathのコンストラクターでcell.Widthが値を取得する場合、EventCell.ActualWidthPropertyがDPである場合は"ActualWidth"でDPフィールドを取得するか、文字列_ [SOMECODE]を使用します。 _。

このようにXAMLを変換するときは、XAMLで使用されているのと同じコンストラクタであるBindingコンストラクタにパスを設定するだけです(パスが修飾されていないため)。

Binding b = new Binding("ActualWidth");

(バインディングがXAMLに変換される場合、{Binding Path=123.4, ...}のようになります。コンストラクタを使用しなかったため、Pathプロパティは修飾されていることに注意してください設定する)

編集:もちろん、EventCell.WidthPropertyにもバインディングを設定する必要があります。ActualWidthを設定することはできません。ロジックが逆になっているようです...

21
H.B.

ActualWidthPropertyNotifyPropertyChangedイベントをスローさせる必要があると思います。そうしないと、プロパティが変更されたときにバインディングが更新を認識できなくなります。バインディングを行うたびに、常にINotifyPropertyChangedを実装する必要がありました。

リストビュークラスを拡張してから、それをwidthプロパティに実装してみてください。私はここで同様の答えを出しました: WPF Toolkit DataGrid column resize event

0
Chad La Guardia