さまざまな理由により、この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#コードはコンパイルできません。その理由がわかりません。
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
を設定することはできません。ロジックが逆になっているようです...
ActualWidthProperty
にNotifyPropertyChanged
イベントをスローさせる必要があると思います。そうしないと、プロパティが変更されたときにバインディングが更新を認識できなくなります。バインディングを行うたびに、常にINotifyPropertyChanged
を実装する必要がありました。
リストビュークラスを拡張してから、それをwidthプロパティに実装してみてください。私はここで同様の答えを出しました: WPF Toolkit DataGrid column resize event