2009-04-02 14 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は具体的にはタイプObjectに対してDataTemplateを指定することを禁止しています。

正確な要件に応じて、特定のタイプに一致する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は型オブジェクトにできません。 –

+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のテキストブロックのdoesntのは、それが正常にどのように見えるかを表示するように、コンバータを持っていることに注意してください) 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 
    } 
} 
関連する問題