2009-08-01 22 views
32

Tôi nghĩ điều này là có thể, nhưng cách rõ ràng không hiệu quả.Hiển thị DataTemplate mặc định trong một ContentControl khi nội dung của nó là rỗng hoặc trống?

Hiện nay, tôi đang làm điều này:

<ContentControl 
    Content="{Binding HurfView.EditedPart}"> 
    <ContentControl.Resources> 
     <Style 
      TargetType="ContentControl" 
      x:Key="emptytemplate"> 
      <Style.Triggers> 
       <DataTrigger 
        Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" 
        Value="{x:Null}"> 
        <Setter 
         Property="ContentControl.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Grid 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch"> 
            <TextBlock>EMPTY!</TextBlock> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Resources> 
</ContentControl> 

tôi không nhận được bất kỳ lỗi nào ràng buộc và điều này biên dịch. Tuy nhiên, nó không tạo ra kết quả mong đợi. Tôi cũng đã thử hiển thị:

<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate> 

Điều này sẽ không biên dịch. Và cố gắng đặt nội dung hai lần cũng không thành công:

<ContentControl 
    Content="{Binding HurfView.EditedPart}"> 
     <TextBlock>DEFAULT DISPLAY</TextBlock> 
</ContentControl> 

Tôi có thể làm điều này mà không cần viết bộ chọn mẫu tùy chỉnh không?

Trả lời

45

đơn giản, bạn phải liên kết thuộc tính nội dung trong phong cách. Kiểu sẽ không ghi đè giá trị trên điều khiển nếu có giá trị ràng buộc, ngay cả khi giá trị đánh giá là Null. Thử cái này.

<ContentControl> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Content" Value="{Binding HurfView.EditedPart}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}"> 
        <Setter Property="ContentControl.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
            <TextBlock>EMPTY!</TextBlock> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 
+0

Đã hoạt động! Cảm ơn. – Will

+0

Không có vấn đề đó là một sai lầm rất phổ biến mà mọi người mắc phải khi cố gắng làm những điều phức tạp hơn với phong cách và trình kích hoạt. –

+1

Mỗi khi tôi trở lại cho điều này tôi sẽ để lại một bình luận. Cảm ơn. – Will

1

Bạn có thể trở lại DBNull.Value như FallbackValue của Ràng buộc đối với nội dung của ContentControl, và tạo ra một DataTemplate cho DBNull:

<DataTemplate DataType="{x:Type system:DBNull}"> 
    <!-- The default template --> 
</DataTemplate> 

... 

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" /> 
+4

Đó là kinda lạ ... Nó được tôi hiểu phương thức ưa thích là trả về [DependencyProperty.UnsetValue] (http://msdn.microsoft.com/en-us/library/system.windows.dependencyproperty.unsetvalue.aspx). Tôi đã làm điều này trong một số loại chuyển đổi và nó làm việc tốt ... – Will

+2

@ Will, vâng, điều đó có lẽ sẽ tốt hơn. Tôi đã viết câu trả lời đó hơn một năm trước, và sự hiểu biết của tôi về WPF lúc đó vẫn còn rất không đầy đủ ... –

+0

Tôi biết cảm giác ... – Will

9

Vì tôi tình cờ gặp phải câu hỏi này và có cùng một vấn đề ngày hôm nay, tôi muốn đóng góp một cách khác để giải quyết vấn đề. Vì tôi không muốn thêm một kích hoạt phong cách tôi đã sử dụng tài sản TargetNullValue mà có vẻ là một chút dễ đọc hơn so với giải pháp được chấp nhận (trong đó hoạt động vẫn):

<ContentControl> 
     <ContentControl.Content> 
     <Binding Path="ContentViewModel"> 
      <Binding.TargetNullValue> 
      <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <TextBlock>EMPTY!</TextBlock> 
      </Grid> 
      </Binding.TargetNullValue> 
     </Binding> 
     </ContentControl.Content> 
    </ContentControl> 
+0

đây là một giải pháp thanh lịch với TargetNullValue. Nice tìm thấy – juFo

+0

Nếu tôi có thể cung cấp cho 10k upvotes ... – curob

+0

Hoạt động, nhưng trong một số trường hợp như tôi nó sản xuất Binding-Errors. Mặc dù tôi cũng nghĩ rằng đây là một trong những dễ đọc hơn, kiểm tra mới Binding-lỗi khi sử dụng nó. – Dima

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