Я думал о том, чтобы сделать это, а не определять множество DataTemplates. Это означало бы, что если бы у меня была коллекция вещей, у самого ItemsControl был бы класс XAML, и у объектов тоже был бы один.
Это то, что уже происходит, когда объекты являются правильными ViewModels, содержащими модели и логику, но если это, например, просто команда. Возможно, динамическая группа команд.
Плюсы: я мог бы использовать конструктор, чтобы помочь мне определить внешний вид объекта, так как у меня нет наложения, и было бы легче найти и изменить эти части при необходимости.
Минусы: больше классов XAML.
Не могли бы вы рассказать мне об этом или об этом?
Пример
У меня есть кнопки по всему приложению, поэтому я определяю ButtonViewModel, которая имеет отображаемое имя и свойство ICommand. Для этого объекта я бы также определил DataTemplate или UserControl, который в основном представлял бы собой кнопку с привязкой команд и привязкой текста / содержимого к отображаемому имени. Я мог бы также определить его внешний вид и тому подобное.
Тогда в ViewModels, которая должна включать кнопки, я бы добавил эти кнопки как часть класса и привязал бы их внутри представления.
public class ButtonViewModel : ViewModelBase
{
private string _displayName;
public string DisplayName
{
get
{
return _displayName;
}
set
{
_displayName = value;
RaisePropertyChanged("DisplayName");
}
}
private ICommand _command;
public ICommand command
{
get
{
return _command;
}
protected set
{
_command = value;
RaisePropertyChanged("Command");
}
}
public ButtonViewModel(ICommand command, string displayName)
{
Command = command;
DisplayName = displayName;
}
}
ViewModel с использованием ButtonViewModel
public class SomeViewModel : ViewModelBase
{
//some functionality
//It could be done as a collection or just seperate ButtonViewModel properties
public ObservableCollection<ButtonViewModel> Buttons { get; set; }
//Somewhere where it makes sense, here in the constructer for the heck of it
public SomeViewModel()
{
Buttons.Add(new ButtonViewModel(new RelayCommand(Save, canSave), "Save"));
Buttons.Add(new ButtonViewModel(new RelayCommand(Edit, canEdit), "Edit"));
Buttons.Add(new ButtonViewModel(new RelayCommand(New, canAddNew), "New"));
}
}
Вид кнопок:
<UserControl x:Class="WpfApplication1.ButtonView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="60" Width="90">
<Button Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}">
<!-- Some really cool design for your button -->
</Button>
</UserControl>
Вы также можете определить конкретный ItemsControl для хранения набора кнопок, даже если вы даже определите ViewModel для указанного элемента управления.
Однажды я узнал, что если вы можете инкапсулировать какой-то предмет в классе, вы должны это сделать. Это просто сумасшедший разговор?