[Chỉnh sửa]: Tôi đã tìm ra cách tự làm điều này. Tôi đã đăng giải pháp của mình với hy vọng rằng nó sẽ tiết kiệm cho người khác một vài ngày googling. Nếu bạn là một guru WPF, hãy nhìn vào giải pháp của tôi và cho tôi biết nếu có một cách tốt hơn/thanh lịch hơn/hiệu quả hơn để làm điều này. Đặc biệt, tôi quan tâm đến việc biết những gì tôi không biết ... làm thế nào là giải pháp này sẽ vít tôi xuống đường? Vấn đề thực sự sôi xuống để lộ các đặc tính điều khiển bên trong.Hiển thị các thuộc tính Điều khiển bên trong để gắn kết trong WPF
Sự cố: Tôi đang tạo một số mã để tự động tạo GUI kết nối dữ liệu trong WPF cho tệp XML. Tôi có một tập tin xsd có thể giúp tôi xác định các loại nút, vv Đơn giản Key/giá trị yếu tố rất dễ dàng.
Khi tôi phân tích yếu tố này:
<Key>value</Key>
tôi có thể tạo ra một mới 'KeyValueControl' và thiết lập DataContext
đến yếu tố này. KeyValue được định nghĩa là một UserControl và chỉ có một số ràng buộc đơn giản trên nó. Nó hoạt động tuyệt vời cho bất kỳ XElement đơn giản nào.
Các XAML bên trong kiểm soát này trông như thế này:
<Label Content={Binding Path=Name} />
<TextBox Text={Binding Path=Value} />
Kết quả là một dòng mà có một nhãn với tên phần tử và một hộp văn bản với giá trị mà tôi có thể chỉnh sửa.
Bây giờ, có những lúc tôi cần hiển thị giá trị tra cứu thay vì giá trị thực tế. Tôi muốn tạo một 'KeyValueComboBox' tương tự như KeyValueControl ở trên nhưng có thể chỉ định (dựa trên thông tin trong tệp) đường dẫn ItemsSource, Display và Value. Các ràng buộc 'Tên' và 'Giá trị' sẽ giống như KeyValueControl.
Tôi không biết liệu điều khiển người dùng chuẩn có thể xử lý điều này hay tôi cần kế thừa từ Bộ chọn.
Các XAML trong việc kiểm soát sẽ giống như thế này:
<Label Content={Binding Path=Name} />
<ComboBox SelectedValue={Binding Path=Value}
ItemsSource={Binding [BOUND TO THE ItemsSource PROPERTY OF THIS CUSTOM CONTROL]
DisplayMemberPath={Binding [BOUND TO THE DisplayMemberPath OF THIS CUSTOM CONTROL]
SelectedValuePath={Binding [BOUND TO THE SelectedValuePath OF THIS CUSTOM CONTROL]/>
Trong mã của tôi, sau đó tôi sẽ làm một cái gì đó như thế này (giả định rằng nút này là một 'Thing' và cần phải hiển thị một danh sách các Mọi thứ vì vậy người dùng có thể chọn ID:
var myBoundComboBox = new KeyValueComboBox();
myBoundComboBox.ItemsSource = getThingsList();
myBoundComboBox.DisplayMemberPath = "ThingName";
myBoundComboBox.ValueMemberPath = "ThingID"
myBoundComboBox.DataContext = thisXElement;
...
myStackPanel.Children.Add(myBoundComboBox)
vì vậy, câu hỏi của tôi là:
1) tôi có nên kế thừa KeyValueComboBox tôi từ kiểm soát hoặc Selector?
2) Nếu tôi nên kế thừa từ Kiểm soát, làm cách nào để hiển thị các mục của Hộp kết hợp bên trong, DisplayMemberPath và ValueMemberPath để ràng buộc?
3) Nếu tôi cần kế thừa từ Bộ chọn, ai đó có thể cung cấp ví dụ nhỏ về cách tôi có thể bắt đầu với điều đó không? Một lần nữa, tôi mới vào WPF vì vậy một ví dụ đơn giản, tốt đẹp sẽ thực sự giúp đỡ nếu đó là con đường tôi cần phải thực hiện.
Tôi đang sử dụng một kỹ thuật tương tự nhưng chạy vào rắc rối khi tôi bản thân các mục được thiết lập để sử dụng các liên kết RelativeSource. Vì vậy, trong trường hợp của bạn nếu bạn gán một tập hợp các phần tử ComboBoxItem như là ItemsSource của bạn và có một ràng buộc với một cái gì đó lên cây logic bằng cách sử dụng RelativeSource binding đến FindAncestor để liên kết với một thuộc tính được định nghĩa trên phần tử anscestor đó thì ràng buộc sẽ thất bại. – jpierson
Tôi chỉ sử dụng điều này cho một trường hợp rất giống nhau, câu trả lời tốt. Trong ứng dụng của tôi, tôi đã liên kết với SelectedItem của một Combobox. Nó chỉ nên được lưu ý rằng để ràng buộc để hoạt động đúng, trong một số trường hợp nó là cần thiết để thêm vào chế độ ràng buộc = twoway và UpdateSourceTrigger = PropertyChanged – Cocomico