2011-08-08 37 views
13

Tôi đang cố gắng để chuyển đổi ràng buộc với nó XAML này là C# đối vì nhiều lý do:WPF Binding lập trình

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

Tôi đã đọc rất nhiều câu hỏi đã được rằng đã có vấn đề tương tự và đã đưa ra với mã này:

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

Nhưng mã C# sẽ không biên dịch được, tôi khá mất lý do tại sao.

+0

Tại sao mã không biên dịch? Lỗi là gì? –

Trả lời

16

Trong hàm tạo của PropertyPath giá trị cell.Width nhận giá trị, bạn muốn EventCell.ActualWidthProperty để lấy trường DP nếu đó là DP hoặc sử dụng chuỗi, "ActualWidth".

Khi dịch XAML như thế này, chỉ cần thiết lập các đường dẫn trong các nhà xây dựng Ràng buộc đó là các nhà xây dựng được sử dụng trong XAML (như con đường là không đủ điều kiện):

Binding b = new Binding("ActualWidth"); 

(Nếu bạn ràng buộc là phải dịch trở lại XAML nó sẽ là một cái gì đó giống như {Binding Path=123.4, ...}, lưu ý rằng Path tài sản có đủ điều kiện như bạn không sử dụng các nhà xây dựng để thiết lập nó)

Edit: Ngoài ra nhu cầu ràng buộc để được đặt trên EventCell.WidthProperty tất nhiên, bạn không thể đặt ActualWidth, có vẻ như logic của bạn đã bị đảo ngược ...

+0

Vẫn mang lại cho tôi XamlParseException bị hủy. với b.Path = new PropertyPath (EventCell.WidthProperty); hoặc b.Path = new PropertyPath ("ActualWidth"); – xvpower

+1

@xvpower: Xem chỉnh sửa của tôi (và 'PropertyPath (EventCell.WidthProperty)' là sai, phải là 'PropertyPath (EventCell.ActualWidthProperty)') –

+0

Hoạt động hoàn toàn cảm ơn! – xvpower

0

Tôi tin rằng bạn cần phải thực hiện ActualWidthProperty ném sự kiện NotifyPropertyChanged. Nếu không, ràng buộc sẽ không biết cập nhật khi thuộc tính thay đổi. Bất cứ khi nào tôi thực hiện các ràng buộc, tôi luôn phải triển khai INotifyPropertyChanged.

Bạn có thể thử mở rộng lớp xem danh sách và sau đó triển khai nó trên thuộc tính chiều rộng. Tôi đã đưa ra câu trả lời tương tự tại đây: WPF Toolkit DataGrid column resize event

+0

ActualWidth có lẽ đã là một DependencyProperty của điều khiển. –

+0

Ah, hóa ra là vậy. Trong trường hợp đó, bạn không cần triển khai sự kiện đã thay đổi thuộc tính –