Giả sử chúng ta có một DataSource liên kết với một bộ sưu tập từ Cơ sở dữ liệu. Dĩ nhiên không có item null nào cả. Cách thêm mục void vào ComboBox, để người dùng tải đầu tiên sẽ thấy một chuỗi trống. Tôi không muốn thêm đối tượng giả/void vào Bộ sưu tập. Tối ưu trong XAML. Bất kỳ đề xuất nào?ComboBox với mục trống?
Trả lời
<ComboBox Name="myComboBox" Width="200" Background="White">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False" Foreground="Black">Select Item</ComboBoxItem>
<CollectionContainer Collection="{Binding Source={StaticResource DataKey}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
EDIT
Như @surfen nêu trong bình luận, BindingProxy là cách giải quyết cho vấn đề ràng buộc
OK tuyệt vời. Nhưng làm thế nào để làm cho món hàng đầu tiên không thể chọn được? Chỉ có thể chọn các mục nguồn dữ liệu. –
Xem bài viết đã chỉnh sửa, bạn chỉ cần thêm IsEnabled = "False" Foreground = "Black" vào các thuộc tính của mục –
OK xin lỗi tôi đã không nhận thấy các thuộc tính đó. Cảm ơn bạn ! –
<UserControl.Resources>
<CollectionViewSource x:Key="Modules" Source="{Binding Path=Modules}" />
</UserControl.Resources>
<abv:ComboBox SelectedIndex="0" IsNullable="True"
SelectedItem="{Binding Path=SelectedModule, Mode=TwoWay}">
<abv:ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem Content="{DynamicResource EmptyModuleComboBox}"/>
<CollectionContainer Collection="{Binding Source={StaticResource Modules}}" />
</CompositeCollection>
</abv:ComboBox.ItemsSource>
</abv:ComboBox>
public class ComboBox : System.Windows.Controls.ComboBox
{
public static readonly DependencyProperty IsNullableProperty =
DependencyProperty.Register("IsNullable", typeof(bool), typeof(ComboBox));
public bool IsNullable
{
get { return (bool)GetValue(IsNullableProperty); }
set { SetValue(IsNullableProperty, value); }
}
public ComboBox()
{
Loaded += ComboBox_Loaded;
}
void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
if (IsNullable)
{
this.ItemContainerStyle = new Style();
this.ItemContainerStyle.Setters.Add(new EventSetter()
{
Event = ComboBoxItem.PreviewMouseUpEvent,
Handler = new MouseButtonEventHandler(cmbItem_PreviewMouseUp)
});
}
}
public void cmbItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
if (Items.IndexOf(sender as ComboBoxItem) == 0)
{
SelectedItem = null;
}
}
}
Bạn có thể giải thích tại sao điều này không công trinh? – nikaltipar
Điều này hoạt động vì đăng ký sự kiện di chuột lên –
Đối với ràng buộc đối với MVVM đối tượng:
<ComboBox Name="cbbFiltres" SelectedItem="{Binding ElmtInfo, Mode=TwoWay}" Height="26" MinWidth="90" SelectedIndex="0" SelectedValuePath="Id">
<ComboBox.Resources>
<CollectionViewSource x:Key="cvsFiltres" Source="{Binding Elmts.items}"/>
</ComboBox.Resources>
<ComboBox.ItemsSource>
<CompositeCollection>
<model:tblFiltreChamps Desc="{x:Static resx:resMain.enumAucun}" Id="0"/>
<CollectionContainer Collection="{Binding Source={StaticResource cvsFiltres}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
Và đối với ràng buộc trên:
<Label Visibility="{Binding Path=SelectedValue, ElementName=cbbFiltres, Converter={StaticResource NullToVisibility}}" />
Và bộ chuyển đổi chung:
public class ConvNullToVisibility : IValueConverter {
/// <summary>Convertisseur pour le Get.</summary>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return Visibility.Visible; // Pour annuler l'effet dans le designer: http://stackoverflow.com/questions/33401900/wpf-detect-design-mode-in-a-converter
return ((value == null) || (string.IsNullOrEmpty(value.ToString())) || (value.ToString() == "0")) ? Visibility.Collapsed : Visibility.Visible;
}
/// <summary>Convertisseur inverse, pour le Set (Binding).</summary>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (value is Visibility) {
return (((Visibility)value) == Visibility.Visible) ? true : false;
} else return false;
}
}
Chỉ cần quan trọng để khai báo các SelectedValuePath trong combobox. :-)
- 1. link_to với mục tiêu trống
- 2. Loại bỏ mục nhập rỗng trong combobox
- 3. Tìm mục trong WPF ComboBox
- 4. Tạo ComboBox WinForms với các mục không thể chọn
- 5. Nhóm các mục trong một ComboBox
- 6. Tạo kiểu WPF Các mục ComboBox
- 7. Đặt mục ComboBox mục được chọn làm nổi bật màu
- 8. WPF: Nullable ComboBox
- 9. Kiểm tra nếu một ComboBox chứa mục
- 10. Thêm các mục vào comboBox trong WPF
- 11. C# Hộp thư với ComboBox
- 12. Display enum trong ComboBox với không gian
- 13. binding combobox để combobox khác trong WPF
- 14. combobox jquery ui autocomplete với các loại
- 15. Loại trừ các thư mục trống với Jar Jar Links
- 16. Bao gồm thư mục trống với python setup.py sdist
- 17. Delphi Thêm các mục vào tốc độ ComboBox
- 18. Thêm mục nhập trống vào hộp tổ hợp được ràng buộc vào danh sách thực thể
- 19. Nhận thẻ của mục đã chọn trong WPF ComboBox
- 20. C# Mục di chuyển Combobox ở cuối danh sách
- 21. Chọn một mục trong comboBox bằng cách nhập
- 22. Vô hiệu hóa các mục cụ thể trong một Combobox
- 23. wpf combobox binding
- 24. cách để ràng buộc ComboBox với DataTable
- 25. Chọn giá trị trên combobox với jquery
- 26. Combobox với hộp kiểm trong winforms
- 27. WPF ComboBox với textbox có thể chỉnh sửa như một mục
- 28. Cách hiển thị văn bản trong combobox khi không có mục nào được chọn?
- 29. WPF Combobox DisplayMemberPath
- 30. JavaFX - ComboBox đã lọc
Hãy coi chừng, đó là giải pháp cung cấp KHÔNG làm việc với ràng buộc. – Cartesius00
Tôi tìm thấy một cách xung quanh vấn đề ràng buộc xem bài đăng này: http://stackoverflow.com/questions/6446699/how-do-you-bind-a-collectioncontainer-to-a-collection-in-a-view-model – Frinavale