2009-04-02 23 views
8

wpf uygulamada varsayılan DataTemplate .ToString() yöntem sonucu görüntüler belirtin. Varsayılan DataTemplate'in hiçbir şey göstermemesi gereken bir uygulama geliştiriyorum.varsayılan boş DataTemplate yerine varsayılan 'ToString()' DataTemplate

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

Ama bu işe yaramazsa:

denedim. Uygulamanın her sınıf türü için belirli bir DataTemplate belirtmeden bunun mümkün olup olmadığını bilen var mı?

cevap

4

Bunu yapmak için hiçbir yol bilmiyorum. Aşağıda Joe'nun açıklama uyarınca, WPF özellikle tip Object için DataTemplate belirterek izin vermez.

tam gereksinimleri bağlı olarak, belirli türüne uygun bir DataTemplate aramak için daha kolay olabilir. Eğer bir tane bulursan, onu kullan. Aksi halde, hiçbir şey göstermez. (Açıkçası sözde kod,)

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

Ve seçici içinde

: Örneğin:

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

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

return NulloDataTemplate; 
+2

"WPF tam zamanı türüne göre kendi DataTemplate sahip bir nesne eşleşir". DataType = BaseClass ile bir DataTemplate eklerseniz, bu da Alt Sınıf ile eşleşecektir. Onu gördüm. Ne yazık ki, çerçeve özellikle System.Object için bir DataTemplate yapma izin vermez; Bir çalışma zamanı hatası "tip 'DataTemplateKey' inşaat başarısız oldu. DataTemplate.DataType tipi nesne olamaz." olsun –

+0

Haklısınız. Otomatik olarak devralınmayan Stilleri düşünüyordum. Cevabımı güncelleme. Teşekkürler. –

1

Ben varsayılan DataTemplate yerine hakkında emin değilim ama ekran ToString geçirmek için bir ValueConverter kullanabilirsiniz Aksi halde belirli türlerde ve boş bir dizede.

.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

İşte bazı kod (TypeB textblock doesnt normalde benzediğini göstermek için üzerine dönüştürücü gerektiğine dikkat edin)

<Grid.Resources> 
    <DataTemplate DataType="{x:Type vm:VMBase}"> 
    </DataTemplate> 
</Grid.Resources> 
: Eğer MVVM desen kullanarak ve tüm ViewModel sınıfları türeyen bir soyut sınıf var ise, bunun yerine System.Object o sınıfı kullanabilirsiniz
+2

Hayatımı kurtardın. Tabii ki tam olarak değil elbette ama tam olarak aradığım şey bu. – Firedragon

2

10 Ben, Nullable kullanılan benim durum için çalıştı. İşte

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

(IMO en iyi yolu) bir seçici kullanarak bu nasıl yapılacağı hakkında bir çalışma örneği: - Doğru değil

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 
    } 
} 
İlgili konular