2009-04-02 11 views
8

के बजाय एक डिफ़ॉल्ट खाली डेटा टेम्पलेट निर्दिष्ट करें wpf अनुप्रयोग में डिफ़ॉल्ट डेटा टेम्पलेट .ToString() विधि का परिणाम प्रदर्शित करता है। मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जहां डिफ़ॉल्ट डेटा टेम्पलेट को कुछ भी प्रदर्शित नहीं करना चाहिए।डिफ़ॉल्ट 'ToString()' DataTemplate

मैं कोशिश की है:

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

लेकिन यह काम नहीं करता। क्या किसी को पता है कि आवेदन में प्रत्येक वर्ग प्रकार के लिए एक विशिष्ट डेटा टेम्पलेट निर्दिष्ट किए बिना यह संभव है?

उत्तर

4

मुझे यह करने का कोई तरीका नहीं है। नीचे जो की टिप्पणी के अनुसार, डब्ल्यूपीएफ विशेष रूप से 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 के साथ डेटा टेम्पलेट जोड़ते हैं, तो यह सब क्लास से भी मेल खाएगा। मैंने इसे देखा है। दुर्भाग्यवश, ढांचा विशेष रूप से सिस्टम के लिए डेटा टेम्पलेट बनाने की अनुमति नहीं देता है। ऑब्जेक्ट; आपको रनटाइम त्रुटि मिलती है "प्रकार 'DataTemplateKey' असफल निर्माण। DataTemplate.DataType ऑब्जेक्ट टाइप नहीं किया जा सकता है।" –

+0

आप सही हैं। मैं शैलियों के बारे में सोच रहा था, जो स्वचालित रूप से विरासत में नहीं हैं। मेरा जवाब अपडेट कर रहा है। धन्यवाद। –

1

मैं डिफ़ॉल्ट DataTemplate की जगह के बारे में यकीन नहीं है, लेकिन आप प्रदर्शन ToString पारित करने के लिए एक ValueConverter उपयोग कर सकते हैं कुछ प्रकार के मामले में और एक खाली स्ट्रिंग अन्यथा। यहाँ कुछ कोड है (ध्यान दें कि typeb TextBlock नहीं करता है क्या यह सामान्य रूप से की तरह दिखता है दिखाने के लिए उस पर कनवर्टर है):

.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

यदि आप एमवीवीएम पैटर्न का उपयोग कर रहे हैं और आपके पास एक अमूर्त क्लास है जो आपके सभी व्यू मॉडेल क्लास से निकलती है, तो आप सिस्टम के बजाय उस वर्ग का उपयोग कर सकते हैं। ऑब्जेक्ट:

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

आपने अभी अपना जीवन बचाया है। बिलकुल सचमुच नहीं, लेकिन यह वही है जो मैं ढूंढ रहा था – Firedragon

2

मैंने नलबल का उपयोग किया, मेरी स्थिति के लिए काम किया।

<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 
    } 
}