2009-06-08 21 views
15

Tôi muốn nói với WPF: "Nếu TextBlock không chứa dữ liệu, sau đó không thấy nó."Làm thế nào bạn có thể lấy một XAML TextBlock để thu gọn khi nó không chứa dữ liệu?

TRY # 1 với một đơn giản kích hoạt tạo ra lỗi "viên 'Text' là không hợp lệ vì nó không có một tên loại vòng loại ":.

<StackPanel Margin="10"> 
    <TextBlock Padding="10" Background="Yellow" Text="{Binding MainMessage}"> 
     <TextBlock.Triggers> 
      <Trigger Property="Text" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </Trigger> 
     </TextBlock.Triggers> 
    </TextBlock> 
</StackPanel> 

TRY # 2 với một phong cách kích hoạt sản xuất t ông lỗi Loại 'phong cách' không chứa một lớp công chúng kiểu chuyển đổi:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <Trigger Property="Text" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

TRY # 3 với một phong cách DataTrigger tạo ra lỗi tương tự Loại 'phong cách' không chứa public class type-chuyển đổi:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </DataTrigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="MainMessageStyle" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

TRY # 4: OK, đó là một sự giám sát câm của tôi, quên StaticResource, nhưng thậm chí sau đó cả Hãy thử # 2 và # 3 Hãy thử nhận được một lỗi mới Loại System.Windows.Trigger trong Phong cách không rõ:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <Trigger> 
        <Trigger Property="Text" Value=""> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Trigger> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10">   
     <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 

Vậy làm thế nào để tôi làm điều này?

ĐÁP:

OK, vì vậy đó là một săn cú pháp điên với một kết thúc hạnh phúc, đây là phiên bản làm việc, hy vọng nó sẽ giúp ai đó, bài học kinh nghiệm:

  • nếu kích hoạt, sau đó phong cách
  • nếu phong cách, sau đó StaticResource
  • nếu ràng buộc, sau đó DataTrigger

mã mà hoạt động:

<UserControl x:Class="TestItemsSource234.Views.SmartForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="MainMessageStyle" TargetType="TextBlock"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MainMessage}" Value="{x:Null}"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <StackPanel Margin="10"> 
     <ItemsControl 
      ItemsSource="{Binding DataTypeViews}"/> 
     <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
    </StackPanel> 
</UserControl> 
+7

ugh. tại sao wpf quá khủng khiếp? – PeterAllenWebb

+2

Không có lý do gì cho nhóm WPF vì lý do tại sao # 4 không chỉ hoạt động! Tại sao WPF quá khó hiểu? –

Trả lời

2

Hoặc Hãy thử # 2 hoặc Cố gắng # 3 nên được tốt - vấn đề là trong dòng nơi bạn đang tham khảo phong cách - bạn cần phải sử dụng một trong hai 'Phong cách = "{StaticResource [KeyName]}" 'hoặc' Style = "{DynamicResource [KeyName]}" '.

Hãy thử điều này (trong Thử # 2):

<StackPanel Margin="10">   
    <TextBlock Style="{StaticResource MainMessageStyle}" Padding="10" Background="Yellow" Text="{Binding MainMessage}"/> 
</StackPanel> 

Trong Hãy thử 1 bạn tiết lộ một hạn chế của phiên bản WPF hiện tại: Triggers không được hỗ trợ trực tiếp trên các yếu tố.

+1

"Trình kích hoạt không được hỗ trợ trực tiếp trên các phần tử". - Sau đó trình biên dịch sẽ cho bạn biết điều này, không phải lỗi khác không liên quan. –

1

Tôi nghĩ cách đơn giản nhất để thực hiện việc này là xác định Trình chuyển đổi chuyển đổi chuỗi thành hiển thị.

... 

    return string.IsNullOrEmpty(s) ? Visibility.Collapsed : Visibility.Visible; 
} 

Sau đó chỉ cần

<TextBlock Visibility="{StaticResource StringToVisibilityConverter}" 
5

này, cách đơn giản nhất và nhanh nhất dễ nhất là chuyển đổi. Vì vậy, tại sao không KISS? (giữ cho nó đơn giản ngu ngốc)?

Để triển khai các lớp chuyển đổi chỉ cần một vài dòng mã là cần thiết.

Chuyển đổi:

public class StringToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return string.IsNullOrWhiteSpace((string)value) ? Visibility.Collapsed : Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var visiblity = (Visibility)value; 
     return visiblity == Visibility.Visible; 
    } 
} 

Cách sử dụng:

Bao gồm không gian tên: xmlns:c="clr-namespace:Hfr.Windows.Controls"

Xác định tài nguyên: <c:StringToVisibilityConverter x:Key="StringToVisiblity"/>

Sử dụng:

<TextBlock 
    Text="{Binding SomeStringPropertyValue}" 
    TextWrapping="Wrap" 
    Visibility="{Binding SomeStringPropertyValue, Converter={StaticResource StringToVisiblity}}" /> 

Vì bạn sẽ sử dụng bộ chuyển đổi trong nhiều dự án, triển khai các lớp chuyển đổi trong "thư viện chung".

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