У меня есть приложение WPF, работающее на Caliburn.Micro, первый подход к модели представления. Существует командный тип управления с его CommandBarView.xaml и связан CommandBarViewModel. VM командной строки содержит несколько вложенных виртуальных машин, по одному для каждого элемента управления кнопки, все из которых показывают общий интерфейс и имеют общее поведение. Команда-бар VM подвергать их таким образом они могут быть связаны с точки зрения:В Caliburn.Micro как связать действие с вложенным методом ViewModel?
public interface IWarningButtonViewModel
{
bool IsVisible { get; }
bool CanShowWarning { get; }
void ShowWarning();
}
public class CommandBarViewModel : PropertyChangedBase
{
public IWarningButtonViewModel UserNotFoundWarning { get; private set; }
public IWarningButtonViewModel NetworkProblemWarning { get; private set; }
// ... initialization omitted for simplicity
}
Это предварительный XAML для немного CommandBarView:
<Button x:Name="UserNotFoundWarning_ShowWarning"
IsEnabled="{Binding UserNotFoundWarning.CanShowWarning}">
...
<DataTrigger Binding="{Binding UserNotFoundWarning.IsVisible}" Value="True">
...
</Button>
В этом случае я могу успешно привязать два свойства (CanShowWarning, IsVisible), но я не могу связать команду/действие кнопки с ShowWarning метод.
Я пробовал с deep property binding, и это снова работает для свойств, но не для действий.
Я также попытался с соединением cal:Model.Bind
и cal:Message.Attach
:
<Button cal:Model.Bind="{Binding UserNotFoundWarning}"
cal:Message.Attach="[Event Click] = [Action ShowWarning]"
IsEnabled="{Binding CanShowWarning}">
...
<DataTrigger Binding="{Binding IsVisible}" Value="True">
...
</Button>
Это похоже на работу во время выполнения, но кал: Model.Bind делает конструктор VS полностью непригодным для использования, управления пользовательского интерфейса не отображаются.
Я искал вокруг совсем немного, но я не мог найти фактическое решение, которое позволило бы мне также работать с дизайнером. Мне кажется странным, что я могу найти примеры глубокой привязки свойств, а не действий.
Любая идея, как решить эту проблему?
Вам действительно нужно, чтобы UserNotFoundWarning являлся свойством 'interface'? Кажется странным иметь виртуальную машину для простой кнопки, простой способ. –
Командная строка VM содержит несколько таких кнопок. Каждая кнопка подписывается на некоторый уровень бизнес-уровня, который можно наблюдать, чтобы определить, должно ли оно быть видимым. Таким образом, каждый из них должен иметь свою собственную IsXxxWarningButtonVisible с такой логикой, и VM командной строки потребует этих зависимостей бизнес-уровня, чтобы просто передать их этой логике. Затем все кнопки разделяют общую логику, связанную с командой и ее защитой, только между ними меняется только фактический текст предупреждения. Я начал этот путь, но потом у меня было много ShowXxxWarning, CanShowXxxWarning, IsXxxWarningVisible ... не так уж хорошо – superjos
Помимо дизайнерских решений, которые, я уверен, могу пересмотреть и поговорить, есть способ - в общем - связать события/действия для вложенных методов VM? – superjos