Укажите пустой DataTemplate по умолчанию вместо DataTemplate «ToString ()» по умолчанию - PullRequest
10 голосов
/ 02 апреля 2009

Стандартный шаблон данных в приложении wpf отображает результат метода .ToString(). Я разрабатываю приложение, в котором по умолчанию DataTemplate ничего не должен отображать.

Я пробовал:

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

Но это не работает. Кто-нибудь знает, возможно ли это без указания конкретного DataTemplate для каждого типа класса в приложении?

Ответы [ 6 ]

4 голосов
/ 14 марта 2011

Если вы используете шаблон MVVM и имеете абстрактный класс, из которого происходят все ваши классы ViewModel, вы можете использовать этот класс вместо System.Object:

<Grid.Resources>
    <DataTemplate DataType="{x:Type vm:VMBase}">
    </DataTemplate>
</Grid.Resources>
4 голосов
/ 02 апреля 2009

Я не знаю, как это сделать. Согласно комментарию Джо ниже, WPF специально запрещает указывать DataTemplate для типа Object.

В зависимости от ваших точных требований, может быть проще найти 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;
3 голосов
/ 23 июля 2015

Я использовал Nullable, работал для моей ситуации.

<DataTemplate DataType="{x:Type sys:Nullable}">
<!-- Content -->
</DataTemplate>
1 голос
/ 04 апреля 2009

Я не уверен насчет замены DataTemplate по умолчанию, но вы можете использовать ValueConverter для передачи отображения ToString в случае определенных типов и пустой строки в противном случае Вот некоторый код (обратите внимание, что в текстовом блоке typeb нет конвертера, чтобы показать, как он выглядит в обычном режиме):

.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
    }
}
0 голосов
/ 29 марта 2018

Я обнаружил что-то случайно. Я использовал пользовательское свойство зависимости, чтобы установить Datacontext для usercontrol, который имел contentcontrol с Datatemplates на основе типов (сущностей в моем случае). Так как у меня было несколько разных видов сущностей, мое свойство зависимостей было

` typeof(object)

Это устройство, которое я использовал для привязки к текстовому контенту ContentControl.

 public object MySelectedItem
    {
        get { return (object)GetValue(Property1Property); }
        set { SetValue(Property1Property, value); }
    }

            public static readonly DependencyProperty Property1Property
        = DependencyProperty.Register(
              "MySelectedItem",
              typeof(object),
              typeof(PromotionsMenu),
              new PropertyMetadata(false)
          );

Используется так:

 MySelectedItem = SomeEntity;

Я обнаружил, что могу использовать это так:

 MySelectedItem = "some text";

И contextcontrol напечатает некоторый текст в качестве своего контекста.

MySelectedItem = "";

работает для абсолютно пустого контекста.

`

0 голосов
/ 19 августа 2017

Вот рабочий пример того, как сделать это с помощью селектора (лучший способ 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
    }
}
...