Подтвердить что ты не робот

WPF привязка программно

Я пытаюсь преобразовать эту привязку xaml к ней на С# по разным причинам:

<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);

Но код С# не будет компилироваться, я довольно потерял, почему.

4b9b3361

Ответ 1

В конструкторе PropertyPath значение cell.Width получает значение, вы хотите либо EventCell.ActualWidthProperty получить DP-поле, если оно является DP, либо использовать строку "ActualWidth".

При переводе XAML, как это, просто установите путь в конструкторе Binding, который является тем же самым конструктором, который используется в XAML (поскольку путь не квалифицирован):

Binding b = new Binding("ActualWidth");

(Если ваша привязка должна была быть переведена обратно в XAML, это будет что-то вроде {Binding Path=123.4, ...}, обратите внимание, что свойство Path определено так, как вы не использовали конструктор для его установки)

Изменить: Также необходимо установить привязку на EventCell.WidthProperty, вы не можете установить ActualWidth, кажется, что ваша логика была инвертирована...

Ответ 2

Я считаю, что вам нужно сделать ActualWidthProperty бросить событие NotifyPropertyChanged. В противном случае привязка не будет знать, когда будет изменено свойство. Всякий раз, когда я делал привязки, мне всегда приходилось реализовывать INotifyPropertyChanged.

Вы можете попробовать расширить класс представления списка и затем реализовать его в свойстве width. Я дал аналогичный ответ здесь: Событие изменения столбца DataGrid WPF Toolkit