Как выставать диалог из основной модели представления, придать ему вход и получить какой -то вывод? [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Как выставать диалог из основной модели представления, придать ему вход и получить какой -то вывод? [закрыто]

Сообщение Anonymous »

У меня есть основное представление модели ViewModela с соответствующим представлением Viewa . Мне нужно породить диалог viewb из этой модели представления, которая имеет свою собственную модель ViewModelb . ViewModela должен иметь возможность предоставить входной параметр для ViewModelb и иметь возможность получить результат обратно. Кроме того, ViewB должен быть создан непосредственно с помощью ViewA , чтобы ViewA может установить себя как владелец ViewB .
Как это сделает? Я прочитал большое количество подходов к достижению этого, но, похоже, все потерпели неудачу при выполнении одного из этих моментов: (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();
}
}
Тогда мой базовый класс модели моего представления имеет событие запроса Colose для диалогов, которые можно использовать для сообщения родительского представления, чтобы закрыть:
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);
}
}
и модель основного представления повышает событие и очень просто отвечает SO:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»