2009-11-06 24 views
9

Tôi có ListBox hiển thị dữ liệu về nhân viên như tên, ảnh bộ phận, số huy hiệu, v.v. Nhân viên có thể có các loại khác nhau như Người quản lý, Nhân viên, Tình nguyện viên. Tôi có 3 mẫu dữ liệu riêng biệt - một cho mỗi loại. Tất cả các mẫu này hiển thị cơ bản cùng một dữ liệu nhưng được trình bày khác nhau.WPF - Tham số cho DataTemplates?

Tùy thuộc vào người dùng đăng nhập vào hình ảnh ứng dụng, Số hiệu huy hiệu, v.v., có thể hoặc không thể hiển thị. Vì vậy, tôi có thuộc tính boolean cho rằng - CanSeePhotos, CanSeeBadgeNumbers, vv Vì vậy, nếu CanSeePhotos == sai, tất cả các mẫu dữ liệu nên ẩn các bức ảnh.

Câu hỏi của tôi là, làm cách nào tôi có thể sử dụng các thuộc tính boolean này bên trong mẫu dữ liệu của mình để chuyển đổi chế độ hiển thị của các mục thích hợp? Có cách nào để chuyển các tham số vào mẫu dữ liệu khi tôi trả về chúng từ TemplateSelector của tôi không?

Cảm ơn!

chỉnh sửa: sau ý tưởng của Ray tôi đã kết thúc làm điều này:

Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}" 

Trả lời

4

Trên thực tế có một cách để tùy chỉnh DataTemplates khi họ được trả về từ TemplateSelector bao bì của họ bên trong một FrameworkElementFactory, nhưng nó là quá phức tạp cho nhu cầu của bạn.

Đối với trường hợp của bạn, có hai giải pháp dễ dàng hơn nhiều: trình kích hoạt và trình chuyển đổi.

Triggers

Bạn có thể sử dụng một kích hoạt bên trong DataTemplate. Ví dụ: cung cấp cho TextBox hoặc Bảng điều khiển nơi bạn hiển thị số huy hiệu x: Tên, sau đó tạo DataTrigger trên thuộc tính CanSeeBadgeNumebers. Thêm một setter vào DataTrigger và thiết lập thuộc tính Visible thành Hidden hoặc Collapsed, tham chiếu nó theo tên.

cơ bản ý tưởng:

<DataTemplate> 
    ... 
    <DockPanel x:Name="BadgeNumberPanel"> 
    <Label ... /> 
    <TextBox ... /> 
    </DockPanel> 
    ... 

    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding CanSeeBadgeNumbers}" Value="true"> 
     <Setter ElementName="BadgeNumberPanel" Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Converters

Bạn có thể tạo một IValueConverter trong mã chuyển đổi "bool" loại để "Tầm nhìn" loại (có rất nhiều ví dụ ra có bạn có thể cắt và dán), sau đó liên kết visibilty của TextBox với CanSeeBadgeNumbers, bằng cách sử dụng bộ chuyển đổi.

<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}"> 
    <Label ... /> 
    <TextBox ... /> 
</DockPanel> 

Làm thế nào tôi làm điều đó

Tôi thực sự sử dụng một kỹ thuật khác cho mã của riêng tôi: nền tảng dữ liệu của tôi bao gồm một MarkupExtension tôi đã viết mà các cuộc gọi lõi C# biểu phân tích cú pháp của tôi, vì vậy tôi có thể nói điều gì đó như

Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}" 

Rất tiếc, nền tảng dữ liệu của tôi chưa được phát hành. Khi đó, tôi dự định biến nó thành nguồn mở và miễn phí, nhưng đó là một vài tháng nữa.

+1

Nếu CanSeeBadgeNumber của bạn không phải là thuộc tính của dữ liệu nhưng môi trường bạn có thể phải thêm một thứ gì đó như Source = "{x: Static UserInfo.CurrentUser}" vào liên kết của bạn. Điều này là giống nhau cho dù bạn sử dụng trình kích hoạt hoặc trình chuyển đổi. –

+1

Biểu thức trong các ràng buộc XAML! Tôi đã chờ đợi điều đó trong một thời gian dài - thực sự nhớ nó từ ngày Flex của tôi. Hãy chờ đón nó nhé! – Grokys

+4

Vì vậy, bạn đã bao giờ phát hành nó? – BrainSlugs83

Các vấn đề liên quan