Tôi đang cố gắng gắn một DependancyProperty
vào một trong các liên kết người dùng của tôi với thuộc tính Width
của Column
trong một Grid
.Kết nối WPF với chiều rộng cột lưới
tôi có mã tương tự như sau:
<Grid x:Name="MyGridName">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="TitleSection" Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<GridSplitter x:Name="MyGridSplitter" Grid.Row="0" Grid.Column="0" ... />
</Grid>
Trong một usercontrol riêng tôi có sau DependancyProperty
xác định.
public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(int), typeof(MyUserControl));
public int TitleWidth
{
get { return (int)base.GetValue(TitleWidthProperty); }
set { base.SetValue(TitleWidthProperty, value); }
}
tôi đang tạo ra thể hiện của các UserControl trong mã, vì vậy tôi có một tuyên bố ràng buộc tương tự như sau:
MyUserControl Cntrl = new MyUserControl(/* Construction Params */);
BindingOperations.SetBinding(Cntrl , MyUserControl.AnotherProperty, new Binding { ElementName = "objZoomSlider", Path = new PropertyPath("Value"), Mode = BindingMode.OneWay });
BindingOperations.SetBinding(Cntrl , MyUserControl.TitleWidthProperty, new Binding { ElementName = "TitleSection", Path = new PropertyPath("ActualWidth"), Mode = BindingMode.OneWay });
/* Other operations on Cntrl */
Đầu tiên ràng buộc công trình quy định fantastically, mặc dù đó là ràng buộc để một UIElement thực tế (trong trường hợp này là Slider), nhưng Binding to "TitleSection" (là ColumnDefinition được định nghĩa trong Grid) không thành công. Đặt một breakpoint trong mã và làm một chiếc đồng hồ trên "TitleSection" trả về đối tượng mong đợi.
Tôi bắt đầu nghi ngờ rằng không thể ràng buộc ColumnDefinition x: Name'd. Có ai có thể đề xuất cách tôi có thể liên kết với chiều rộng thay đổi của cột đầu tiên trong lưới của tôi không?
EDIT # 1 - Để trả lời bình luận
Các databinding 'thất bại' theo nghĩa là với một breakpoint đặt trên setter cho TitleWidth
bất động sản, và sử dụng điều khiển GridSplitter để thay đổi kích thước cột đầu tiên, breakpoint là không bao giờ trúng. Ngoài ra, mã tôi mong đợi sẽ được kích hoạt khi các thay đổi DependancyProperty TitleWidth
không được thực hiện.
Bảng điều khiển người dùng đang được tạo và thêm vào Stackpanel trong lưới trong hàm Window_Loaded
. Tôi hy vọng rằng Grid đã được render vào thời điểm các Usercontrol đang được xây dựng. Chắc chắn x: Name'd Element TitleSection
có thể xem và có giá trị 100
khi chúng đang được xây dựng/trước khi sự ràng buộc xảy ra.
EDIT # 2 - Có thể có gì đó liên quan đến điều này?
Tôi đã có một sniff quanh các trang MSDN cho tài liệu Grid ColumnDefinition và đã đi qua GridLength() nhưng tôi không thể có được đầu của tôi xung quanh cách tôi có thể sử dụng điều này trong một biểu thức ràng buộc. Tôi không thể sử dụng GridLengthConverter liên quan như một công cụ chuyển đổi trong mã ràng buộc vì nó không lấy được từ IValueConverter.
Tôi nghiêng về phía nào đó liên kết với thuộc tính ActualWidth của một trong các ô trong đối tượng Lưới. Nó không có vẻ sạch sẽ như ràng buộc với định nghĩa cột, nhưng tại thời điểm này tôi không thể làm được điều đó.
Không, tại sao bạn tạo usercontrol? Lưới đã được hiển thị chưa? – Donnelle
Bạn không thể dựa vào thiết lập các điểm ngắt trong tập hợp/nhận của thuộc tính phụ thuộc, vì chúng sẽ không bao giờ được sử dụng bởi công cụ liên kết. Nội bộ depencency tài sản được thiết lập bằng cách sử dụng SetValue (DependencyProperty, giá trị) –