Введите ObservableCollection <T>для хранения универсального интерфейса - PullRequest
2 голосов
/ 01 июня 2011

Допустим, следующие классы:

public interface ITabViewModel<T> {}

public class FooTabViewModel : ITabViewModel<FooTabViewModel> {}

public class BarTabViewModel : ITabViewModel<BarTabViewModel> {}

public class MainWindowViewModel
{
    private readonly ObservableCollection<?> _tabs;

    public MainWindowViewModel(
        ITabViewModel<FooTabViewModel> fooTabViewModel
        ITabViewModel<BarTabViewModel> barTabViewModel) 
    {
    }

    public ObservableCollection<?> Tabs
    {
        get { return _tabs; }
    }
}

MainWindowViewModel содержит список вкладок (например, рабочих пространств), которые будут привязаны к представлению и отображены с XAML.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, какой универсальный тип дать ObservableCollection. Я мог бы дать ему тип объекта, но мне не очень нравится эта идея. Я понимаю, что могу создавать IFooTabViewModel и IBarTabViewModel, однако, кажется, имеет смысл создавать один универсальный интерфейс, который может использовать каждый TabViewModel.

Может быть, есть другой дизайн, на который я должен обратить внимание?

1 Ответ

3 голосов
/ 01 июня 2011

Есть два вопроса, на которые нужно ответить:

  1. Какое значение вы планируете получить из ITabViewModel<T>, если в нем нет участников?
  2. Как вы планируете использовать свойство Tabs?

Я предполагаю, что Tabs предоставляет список моделей представлений для пользовательского интерфейса, чтобы он мог создать представление вкладки для каждого представления для каждого вида. В этом случае вам не нужен общий тип времени компиляции, потому что, как указывает пустой ITabViewModel<T>, они не имеют ничего общего, кроме того, что включены в Tabs.

Если это предположение верно, я бы сказал, что вы можете полностью исключить тип ITabViewModel<T>, принять FooTabViewModel и BarTabViewModel непосредственно в конструкторе и сделать Tabs типа ObservableCollection<object>.

Я основываю эти решения на том факте, что вы никогда не используете тип ITabViewModel<T> и (по-видимому) ищете какой-то общий интерфейс для группировки набора иначе не связанных классов. Это можно легко представить, используя object вместо изобретения абстракции, которая ничего не абстрагирует.

...