Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Backbone это JavaScript библиотека основанная на шаблоне проектирования Model-View-Presenter (MVP), предназначена для разработки веб-приложений с поддержкой RESTful JSON интерфейса.
BaseWindow, от которого наследуются все окна в программе, чтобы не захламлять ViewModel'ы.писать больше кода только ради того, чтобы не использовать наследование
create table GuiSettingsInt (WindowId int, ParamId int, ParamValue int);
create table GuiSettingsStr (WindowId int, ParamId int, ParamValue varchar(max));select * from GuiSettingsInt where WindowId=:pWID делает в 100 раз больше индексированных чтений, чем хранение в сериализованном виде, несущественно на этих объёмах (100 записей). То, что сериализованное представление не позволяет менять данные средствами SQL, несущественно, потому что для настроек GUI это бессмысленно.[DataContract]
public class SaveViewModel : ViewModel
{
public SaveViewModel()
{
Initialize();
}
public bool DialogResult { get; set; }
public ObservableCollection<DocumentView> Items { get; private set; }
public ObservableCollection<DocumentView> SelectedItems { get; private set; }
public bool IsAllItemsSelected
{
get
{
return Items.Where(i => ApplicationCommands.Save.CanExecute(null, i)).
All(i => SelectedItems.Contains(i));
}
}
public void SetItems(
ObservableCollection<DocumentView> items,
IEnumerable<DocumentView> selectedItems)
{
Items = items;
RaisePropertyChanged(() => Items);
SelectedItems.Clear();
if (selectedItems != null)
SelectedItems.AddRange(selectedItems);
}
[OnDeserialized]
private void Initialize(StreamingContext context = default(StreamingContext))
{
Executed();
CanExecute();
SelectedItems = new ObservableCollection<DocumentView>();
SelectedItems.CollectionChanged += (sender, args) =>
RaisePropertyChanged(() => IsAllItemsSelected);
}
private void CanExecute()
{
this[ApplicationCommands.Save].CanExecute += (sender, args) =>
args.CanExecute = SelectedItems.Any(i =>
ApplicationCommands.Save.CanExecute(null, i));
}
private void Executed()
{
this[ApplicationCommands.Save].Executed += (sender, args) =>
{
var cancelArgs = new CancelEventArgs();
foreach (var item in SelectedItems.
Where(item => ApplicationCommands.Save.CanExecute(null, item)))
{
ApplicationCommands.Save.Execute(cancelArgs, item);
if (cancelArgs.Cancel) break;
}
if (SelectedItems.Any(i =>
ApplicationCommands.Save.CanExecute(null, i)))
{
DialogResult = true;
return;
}
DialogResult = true;
OnClosing(sender, new CancelEventArgs());
};
this[ApplicationCommands.Close].Executed += (sender, args) =>
{
DialogResult = args.Parameter == null;
OnClosing(sender, new CancelEventArgs());
};
this[ApplicationCommands.SelectAll].Executed += (sender, args) =>
{
var isChecked = (bool) args.Parameter;
foreach (var item in Items)
{
if (!SelectedItems.Contains(item) && isChecked)
SelectedItems.Add(item);
if (SelectedItems.Contains(item) && !isChecked)
SelectedItems.Remove(item);
}
};
}
}
Width={Binding [Width,100], Source={Store Type=vm:SettingsViewModel}}CallerMemberName сложно сочетается с обфускацией. Его стоит применять с осторожностью.А вам никода не казалось инжектирование в конструктор несколько неудобным, например, при добавлении или удалении параметра ломались юнит тесты, и их тоже необходимо было править, хотя интерфейс тестируемого объекта, по сути, оставался прежним
Но как же нам лучше сохранять эти значения? Попробуем сериализовать вью-модели! Но?.. Это ведь не DTO-объект, а DataMember — это как раз про DTO.
MVVM: новый взгляд