Trong WPF Listbox
, tôi nhầm lẫn với 2 khái niệm này: ItemTemplate
và ItemContainerStyle
Ai đó có thể giải thích thêm cho tôi không?Sự khác biệt giữa ItemTemplate và ItemContainerStyle trong một ListBox WPF là gì?
Trả lời
ItemTemplate là để tạo kiểu cho cách nội dung của mục dữ liệu của bạn xuất hiện. Bạn sử dụng nó để liên kết các trường dữ liệu, định dạng chuỗi hiển thị, v.v. Nó xác định cách dữ liệu được trình bày.
ItemContainerStyle là để tạo kiểu cho vùng chứa của mục dữ liệu. Trong một hộp danh sách, đây sẽ là một ListBoxItem. Tạo kiểu ở đây ảnh hưởng đến những thứ như hành vi lựa chọn hoặc màu nền. Nó xác định kiểu và UX của màn hình.
Trang MSDN cho ItemContainerStyle, liên kết ở trên, có một ví dụ khá tốt cho thấy một số khác biệt:
<!--Use the ItemTemplate to set a DataTemplate to define the visualization of the data objects. This DataTemplate specifies that each data object appears with the Proriity and TaskName on top of a silver ellipse.--> <ItemsControl.ItemTemplate> <DataTemplate> <DataTemplate.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="18"/> <Setter Property="HorizontalAlignment" Value="Center"/> </Style> </DataTemplate.Resources> <Grid> <Ellipse Fill="Silver"/> <StackPanel> <TextBlock Margin="3,3,3,0" Text="{Binding Path=Priority}"/> <TextBlock Margin="3,0,3,7" Text="{Binding Path=TaskName}"/> </StackPanel> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> <!--Use the ItemContainerStyle property to specify the appearance of the element that contains the data. This ItemContainerStyle gives each item container a margin and a width. There is also a trigger that sets a tooltip that shows the description of the data object when the mouse hovers over the item container.--> <ItemsControl.ItemContainerStyle> <Style> <Setter Property="Control.Width" Value="100"/> <Setter Property="Control.Margin" Value="5"/> <Style.Triggers> <Trigger Property="Control.IsMouseOver" Value="True"> <Setter Property="Control.ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content.Description}"/> </Trigger> </Style.Triggers> </Style> </ItemsControl.ItemContainerStyle>
Các ItemContainerStyle chỉ là một wrapper cho DataTemplate để một phong cách mục chung có thể áp dụng sang các bố cục dữ liệu khác nhau.
Ngoài ra, từ this answer to "DataTemplate vs ItemContainerStyle":
Bạn có thể làm tất cả các phong cách của bạn trong ItemTemplate nhưng ItemContentStyle có VisualStates mà kiểm soát Opacity trên chuột lên/tắt/chọn, vv
Nếu bạn muốn thay đổi những thay đổi trạng thái mờ đục đó, hoặc nếu bạn muốn bất kỳ hình dạng Container nào khác với hình chữ nhật, ví dụ như một hình tam giác, thì bạn sẽ phải ghi đè lên ItemContainerStyle mặc định.
I * mạnh mẽ * đề nghị bạn làm cho nó rõ ràng hơn rằng các văn bản 'bạn có thể làm tất cả các phong cách của bạn trong ItemTemplate nhưng các ItemContentStyle có VisualStates kiểm soát Opacity trên chuột trên/disabled/selected 'và' Nếu bạn muốn thay đổi những thay đổi trạng thái opacity, hoặc nếu bạn muốn bất kỳ hình dạng container khác với một hình chữ nhật, giống như một tam giác ví dụ, sau đó bạn sẽ phải ghi đè lên ItemContainerStyle.' mặc định đã được sao chép từ liên kết được cung cấp; Gần đây họ đã bẻ gãy đạo văn, đó là những gì mà điều này có thể được xem như là. – LittleBobbyTables
Đó là lý do tại sao tôi đưa liên kết vào câu trả lời của mình. Tôi đã làm cho nó rõ ràng hơn này được lấy từ trang web bây giờ. – Jeff
Thực sự là một downvote? Tôi đã tham khảo người liên kết ?? Vui lòng đọc bài viết TOÀN BỘ của tôi trước khi downvote. – Jeff
Có thể liên quan: http://stackoverflow.com/questions/5978358/datatemplate-vs-itemcontainerstyle – LittleBobbyTables