Vì vậy, tôi đã trải qua một số câu hỏi trên trang web và dường như tôi không thể tìm thấy câu trả lời.Mẫu tùy chỉnh cho ComboBox bỏ qua việc sử dụng DisplayMemberPath
Tôi có ComboBox
. Nó hoạt động tốt. Tôi quyết định tôi cần phải sửa chữa lớn xuất hiện, vì vậy tôi tạo ra một bản sao của mẫu ComboBox mặc định (đây là một bản sao thẳng, không có sửa đổi):
<ControlTemplate x:Key="ComboBoxControlTemplate2" TargetType="{x:Type ComboBox}">
<Grid x:Name="MainGrid" SnapsToDevicePixels="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
</Grid.ColumnDefinitions>
<Popup x:Name="PART_Popup" AllowsTransparency="True" Grid.ColumnSpan="2" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom">
<Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=MainGrid}">
<Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
<ScrollViewer x:Name="DropDownScrollViewer">
<Grid RenderOptions.ClearTypeHint="Enabled">
<Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
<Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/>
</Canvas>
<ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Grid>
</ScrollViewer>
</Border>
</Microsoft_Windows_Themes:SystemDropShadowChrome>
</Popup>
<ToggleButton BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="ClickMode" Value="Press"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" SnapsToDevicePixels="True">
<Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
<Path x:Name="Arrow" Data="M0,0L3.5,4 7,0z" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/>
</Grid>
</Microsoft_Windows_Themes:ButtonChrome>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="RenderPressed" TargetName="Chrome" Value="True"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" TargetName="Arrow" Value="#FFAFAFAF"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
</ToggleButton>
<ContentPresenter ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="False" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="True">
<Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
<Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
</Trigger>
<Trigger Property="HasItems" Value="False">
<Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
<Setter Property="Background" Value="#FFF4F4F4"/>
</Trigger>
<Trigger Property="IsGrouping" Value="True">
<Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
</Trigger>
<Trigger Property="CanContentScroll" SourceName="DropDownScrollViewer" Value="False">
<Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
<Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Bây giờ, khi tôi chọn một mục từ danh sách của tôi (đó là một bộ sưu tập các POCO), nó hiển thị không gian tên và tên lớp thay vì giá trị mà nó được cho là.
Nghiên cứu và thử nghiệm của tôi đã khiến tôi tin rằng vấn đề là mẫu mới của tôi không sử dụng thuộc tính DisplayMemberPath
. Tôi đã cố gắng để thiết lập một ItemTemplate
bằng cách ghi đè phương pháp OnDisplayMemberPathChanged
, nhưng điều đó dẫn đến lỗi khi tôi chọn một mục từ danh sách.
Tôi cũng đã thấy mọi người đặt số ItemTemplate
qua XAML, nhưng tôi có hàng trăm combobox và tôi không muốn làm điều đó.
Có cách nào để sử dụng thuộc tính DisplayMemberPath
trong ControlTemplate của tôi hay một số mã tôi có thể chạy trong điều khiển dẫn xuất để đạt được kết quả mong muốn của mình không?
Dude! Điều đó hoàn toàn hiệu quả. Tôi chưa bao giờ thấy giải pháp đó mặc dù, và tôi 100% tích cực nó không bao giờ được tạo ra. Tôi đã thực hiện quá trình này 3 hoặc 4 lần, và kiểm tra điểm số của những người có cùng một vấn đề. Điều này hoàn toàn phải là một lỗi về phía Microsoft ... Cảm ơn bạn! – CamronBute
Bây giờ niềm vui đã lắng xuống, tôi phải hỏi làm thế nào bạn tìm ra điều đó. Bạn đang sử dụng gì để tạo các bản sao mẫu? – CamronBute
@CamronBute: Vâng, tôi luôn có các mẫu mặc định mà bạn có thể nhận được [trên MSDN] (http://msdn.microsoft.com/en-us/library/aa970773.aspx) ('Liên kết Default WPF Themes') tại tay, vì vậy tôi đã kiểm tra nó ra để xem mọi thứ đang bị ràng buộc như thế nào. Không khó để thấy rằng 'ContentPresenter' này là thành phần quan trọng cho mục được chọn vì vậy nếu có lỗi thì nó sẽ ở đó, sau đó tôi chỉ cần so sánh nó với bạn để thấy rằng thuộc tính này bị thiếu. Tôi cũng đã thử nghiệm hiệu quả của việc loại bỏ tài sản đó bản thân mình và như mong đợi nó chỉ cho thấy tên loại. –