Как это сделает? Я прочитал большое количество подходов к достижению этого, но, похоже, все потерпели неудачу при выполнении одного из этих моментов: (1) достаточно прост, (2) способен обеспечить ввод в диалог, (3) способен породить диалог из Viewa , чтобы его можно было правильно владеть, (4) способным вернуть результат в ViewModela , и (5) способен указать на то, что он был «принять». И предпочтительно не требует дополнительных внешних зависимостей. < /P>
для потребности, столь же обычной и распространенной, как основной вид (или какое-то необычное представление), создавая модальный диалог, который может быть построен на основе ввода, обеспечиваемого нерестомным представлением, и может вернуть результат к модели призывного представления, кажется, что на основе того, что я пробует, что я прощупан, я прощупан, я прощупан, что я пробует, чтобы это было выяснить, и я могу понять, что я прощупан, и в этом случае пробуждается. Ниже для моих потребностей, я думаю, достигает всех целей, которые я упомянул. Тем не менее, это никогда не было основано на мнении. Очевидно, что комментаторы испытывают сильные чувства, что мой подход ниже - это не просто вопрос мнения - они считают, что это категорически неправильно. И я считаю, что подход, предложенный в первом комментарии, также очень проблематичен. И есть много других подходов, которые не соответствуют моим критериям выше, и поэтому они не просто различия в мнении - они ошибаются - они не работают . То, что существует несколько подходов к решению проблемы, не делает вопрос, основанный на мнениях или субъективно. Скажем, у вас есть список предметов, и вам регулярно нужно получать элемент из списка. Вы могли бы сделать это с помощью списка. Где (i => i.property == "MagicValue") . Но если вам нужно регулярно получать элементы, хотя там, где работает , это положительный подход . Вы должны сделать словарь и искать предметы на ключе. Тот факт, что оба работы подхода не делают его мнением - использование словаря является не субъективно превосходной практикой кодирования , и эти типы вещей следует обсуждать в переполнении стека, чтобы помочь всем рассказать о самых чистых и наиболее эффективных способах решения проблем, с которыми они сталкиваются. И вся тема для поддержания моделей представления независимо от мнений очень далека от субъективности - люди очень сильно чувствуют себя на самом деле, и я хотел бы услышать их причины. />
Код: Выделить всё
public delegate void DialogEventHandler(DialogEventArgs args);
public class DialogEventArgs(TIn input) : EventArgs
{
public Window Dialog { get; set; }
public TIn Input { get; } = input;
public TOut Output { get; set; }
public bool Accepted { get; private set; }
public void ShowDialog(Window parentWindow)
{
Dialog.OwnerWindow = parentWindow;
Accepted = (bool)Dialog.ShowDialog();
}
}
viewmodelbase.cs
>
Код: Выделить всё
public abstract class ViewModelBase
{
public event EventHandler RequestClose;
protected void OnRequestClose()
{
RequestClose?.Invoke(this, EventArgs.Empty);
}
}
categoriesviewmodel.cs
Код: Выделить всё
public class CategoriesViewModel : ViewModelBase
{
private DialogEventArgs _dialogArgs;
public List SelectedCategories { get; } = [];
public CategoriesViewModel(DialogEventArgs args)
{
_dialogArgs = args;
var input = args.Input;
// do something with input - e.g. initialize a list or something
}
[RelayCommand]
public void Cancel()
{
// do some clean up work
OnRequestClose();
}
[RelayCommand]
public void Commit()
{
args.Output = SelectCategories;
OnRequestClose();
}
}
< /code>
Диалоговое окно передает Dialogeventargs в модель представления и подписывает, чтобы ответить на событие RequestClose. Он также предоставляет заводский метод для легкого построения диалога DialogeVentargs (так как этот диалог может использоваться на протяжении всего приложения).
[b] categoriesdialog.cs[/b]образнойpublic partial class CategoriesDialog() : Window
{
public CategoriesDialog(DialogEventArgs args)
{
InitializeComponent();
var vm = new CategoriesViewModel(args);
DataContext = vm;
vm.RequestClose += (s, e) => Close();
}
public static DialogEventArgs GetDialogArgs(List input)
{
var args = new DialogEventArgs(input);
args.Dialog = new ChooseCategories(args);
return args;
}
}
mainwindow.cs
Код: Выделить всё
public class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
vm = new MainViewModel();
vm.RequestCategoriesDialog += args => args.ShowDialog(this);
}
}
shrong> mainviewmodel.cs
public class MainViewModel : ViewModelBase
{
public event DialogEventHandler RequestCategoriesDialog;
public List CurrentCategories { get; } = [];
[RelayCommand]
private void UpdateCategories()
{
var args = CategoriesDialog.GetDialogArgs(CurrentCategories);
RequestCategoriesDialog?.Invoke(args);
if (args.Accepted)
{
// respond to acceptance
}
}
}
< /code>
Таким образом, обе модели представления остаются агностическими в отношении проблем пользовательского интерфейса, и оба пользовательских интерфейса являются агностическими в отношении входов и выходов, передаваемых обратно и полем с помощью моделей View и могут просто действовать как посланники между ними, при этом обеспечивая любое необходимое поведение пользовательского интерфейса. Если бы я больше реализовал это поведение, у меня, вероятно, был бы класс «DialogViewModelBase», чтобы сделать этот шаблон более повторяемым, но хотел бы сохранить вышеупомянутый пример от грибов.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... eceive-som
Мобильная версия