Каков наилучший способ показать наследуемый объект в wpf? - PullRequest
0 голосов
/ 10 апреля 2009

Допустим, у меня есть это:

public class Result 
{
   public bool Success { get; set; }
   public string Description { get; set; }
}

Затем я хочу добавить еще один уровень, например:

public class AssertionFailedResult : Result
{
  public string Expected { get; set; }
  public string Actual { get; set; }
}

В WPF, как бы я показал простой результат одним способом, а утверждение с ошибкой - другим? Я хотел бы в основном сделать шаблон на основе типа.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2009

Если вы создаете DataTemplate в словаре ресурсов и устанавливаете свойство DataType, но не устанавливаете свойство x: Key, платформа будет связывать DataTemplate с объектами на основе типа времени выполнения объекта. Хорошо это или плохо, наследование не имеет никакого эффекта. Другими словами, даже если у вас не было шаблона, в котором DataType был "AssertionFailedResult", платформа не связывала бы объекты типа "AssertionFailedResult" с шаблоном, в котором DataType был "Результат".

РЕДАКТИРОВАТЬ: Извините, я получил его задом наперед. DataTemplates do имеют "полиморфное" поведение. Стили нет. В любом случае фреймворки должны связываться с DataTemplate с более конкретным DataType.

0 голосов
/ 11 апреля 2009

Я взял ответ Даниила и сделал из него пример. Я думал, что размещение кода может быть полезным:

<Window x:Class="SampleWpfApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:SampleWpfApplication="clr-namespace:SampleWpfApplication">
    <Window.Resources>
        <DataTemplate DataType="{x:Type SampleWpfApplication:Result}">
            <Label>Simple Result</Label>            
        </DataTemplate>
        <DataTemplate DataType="{x:Type SampleWpfApplication:AssertionFailedResult}">
            <Label>Assertion Failed!</Label>
        </DataTemplate>
    </Window.Resources>
    <ContentControl x:Name="contentControl" Content="{Binding Path=Result}" />
</Window>

Далее, класс модели, который является контекстом данных окна:

public class Model
{
    public Result Result { get; set; }
}

И в MainWindow я установил DataContext следующим образом:

DataContext = new Model()
                  {
                      Result = new AssertionFailedResult()
                                   {
                                       Success = false,
                                       Description = "Assertion failed",
                                       Expected = "1",
                                       Actual = "1"
                                   }
                  };

Так что с DataTemplate wpf знает, как визуализировать элемент управления без какого-либо дополнительного указания с моей стороны. Еще раз спасибо, Даниэль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...