2009-04-02 2 views
8

wpf 응용 프로그램의 기본 DataTemplate은 .ToString() 메서드의 결과를 표시합니다. 기본 DataTemplate에 아무것도 표시하지 않는 응용 프로그램을 개발 중입니다.기본 'ToString()'대신 기본 빈 DataTemplate 지정 DataTemplate

<Grid.Resources> 
    <DataTemplate DataType="{x:Type System:Object}"> 
    <Grid></Grid> 
    </DataTemplate> 
</Grid.Resources> 

하지만이 작동하지 않습니다

은 내가 시도했습니다. 응용 프로그램의 모든 클래스 유형에 대해 특정 DataTemplate을 지정하지 않고도 가능하다면 누구든지 알고 있습니까?

답변

4

나는 이것을 할 방법이 없다. 아래 Joe의 의견에 따라 WPF에서는 ObjectDataTemplate을 지정할 수 없습니다.

정확한 요구 사항에 따라 특정 유형과 일치하는 DataTemplate을 더 쉽게 검색 할 수 있습니다. 찾으면 사용하십시오. 그렇지 않으면 아무것도 표시하지 않습니다. (분명히 의사 코드)

<ContentControl Content="{Binding YourContent}" ContentTemplateSelector="{StaticResource MyContentTemplateSelector}"/> 

그리고 당신의 선택에

: 예를 들어

var dataTemplateKey = new DataTemplateKey() { DataType = theType; }; 
var dataTemplate = yourControl.FindResource(dataTemplateKey); 

if (dataTemplate != null) 
{ 
    return dataTemplate; 
} 

return NulloDataTemplate; 
+2

는 "WPF는 정확한 실행시의 형태로 그 DataTemplate을 가진 개체를 일치". DataType = BaseClass 인 DataTemplate을 추가하면 SubClass와도 일치합니다. 나는 그것이 작동하는 것을 보았다. 안타깝게도이 프레임 워크에서는 System.Object 용 DataTemplate을 만들지 않습니다. 런타임 오류가 발생합니다. "형식 'DataTemplateKey'이 (가) 생성되지 못했습니다 .DataTemplate.DataType은 Object를 입력 할 수 없습니다." –

+0

당신 말이 맞아요. Styles는 자동으로 상속받지 않습니다. 내 대답 업데이트 중. 감사. –

1

나는 기본 DataTemplate을 교체에 대한 확실하지 않다,하지만 당신은 디스플레이 ToString을 전달하는 ValueConverter을 사용할 수 있습니다 특정 유형의 경우에는 그렇지 않으면 빈 문자열입니다.

.xaml :

<Window x:Class="EmptyTemplate.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:loc="clr-namespace:EmptyTemplate" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <loc:AType x:Key="atype"/> 
     <loc:BType x:Key="btype"/> 
     <loc:TypeConverter x:Key="TypeConverter"/> 
    </Window.Resources> 
    <StackPanel> 
     <Button Content="{Binding Source={StaticResource atype}, Converter={StaticResource TypeConverter}}"/> 
     <Button Content="{Binding Source={StaticResource btype}, Converter={StaticResource TypeConverter}}"/> 
     <TextBlock Text="{Binding Source={StaticResource atype}, Converter={StaticResource TypeConverter}}"/> 
     <TextBlock Text="{Binding Source={StaticResource btype}}"/> 
    </StackPanel> 
</Window> 

.xaml.cs :

namespace EmptyTemplate 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 
    } 

    public class AType { } 

    public class BType { } 

    public class TypeConverter : IValueConverter 
    { 
     public DataTemplate DefaultTemplate { get; set; } 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value.GetType() == typeof(AType)) 
      { 
       return value.ToString(); 
      } 
      return DefaultTemplate; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 
} 
4

여기에 몇 가지 코드의합니다 (b를 입력의 TextBlock의 나던 정상적으로 모습을 보여주고 그것에 컨버터를 가지고 있습니다) MVVM 패턴을 사용하고 있고 모든 ViewModel 클래스가 파생되는 추상 클래스가있는 경우 System.Object 대신 해당 클래스를 사용할 수 있습니다.

<Grid.Resources> 
    <DataTemplate DataType="{x:Type vm:VMBase}"> 
    </DataTemplate> 
</Grid.Resources> 
+2

방금 ​​내 생명을 구했어. 글자 그대로 글자 그대로는 아니지만 이것은 정확히 내가 찾던 내용입니다. – Firedragon

2

Nullable을 사용하여 제 상황을 해결했습니다. 여기

<DataTemplate DataType="{x:Type sys:Nullable}"> 
<!-- Content --> 
</DataTemplate> 
0

(IMO 가장 좋은 방법) 선택기를 사용하여이 작업을 수행하는 방법에 대한 작업 예제 : - 진실하지

public class EmptyDefaultDataTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item != null) 
     { 
      var dataTemplateKey = new DataTemplateKey(item.GetType()); 
      var dataTemplate = ((FrameworkElement) container).TryFindResource(dataTemplateKey); 
      if (dataTemplate != null) 
       return (DataTemplate) dataTemplate; 
     } 

     return new DataTemplate(); //null does not work 
    } 
}