#wpf #binding #caliburn.micro
#wpf #привязка #caliburn.micro
Вопрос:
Я использую Caliburn Micro для разработки простого MVVM-приложения WPF.
Мой ShellView имеет один ContentControl и три кнопки, каждая из которых привязывается к общедоступному методу в моей ShellViewModel, скажем, ActivateView1, ActivateView2 и ActivateView3.
Моя ShellViewModel наследуется от Conductor и вызывает каждый метод Activate ActivateItem(new View1ViewModel())
и т.д.
Пока все хорошо. Когда я нажимаю кнопку, в ContentControl активируется новое представление. Проблема в том, что мне нужно, чтобы каждая кнопка меняла стиль, когда активен ее «связанный вид», и я действительно понятия не имею, как добиться этой функциональности. У вас есть какие-либо предложения?
Я довольно новичок в Caliburn Micro и WPF-styling, поэтому буду признателен за любую помощь.
Ответ №1:
Я не очень уверен в этом, но все же я могу придумать что-то вроде этого,
вы можете создать стиль и добавить его к своей кнопке. что-то вроде этого
<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Fill" TargetName="yourButtonName" Value="Black"/>
<Setter Property="Margin" TargetName="yourButtonName" Value="5,0,5,0"/>
</Trigger>
</Style.Triggers>
</Style>
и вы можете добавить этот стиль к своей кнопке.
Комментарии:
1. Это не сработает. Когда я нажимаю другую кнопку и активируется другое представление, этот стиль больше не должен быть активирован 🙂
2. вы можете добавить другое действие триггера <Свойство триггера = значение «IsPressed» =»False»> и обновить значение параметра установки
3. Это не заставит его оставаться активным — только при нажатии кнопки. Он должен быть «синхронизирован» с текущим представлением, отображаемым в элементе управления содержимым. Я думал о создании трех логических свойств в моей ViewModel и обновлении их при изменении представления. Что вы думаете об этом.
4. Это сработает, .. или же вы можете использовать переключатель вместо обычной кнопки и оформить их так, чтобы они выглядели как обычная кнопка. и переключайте стиль, когда он отмечен или снят.
5. Как я могу изменить стили в зависимости от значения свойства?
Ответ №2:
Я могу придумать два возможных варианта, которые вы могли бы использовать:
Вы могли бы привязать свойства стиля ваших кнопок к свойствам вашей ShellViewModel. В этих свойствах вы можете определить стиль для возврата на основе активного представления оболочки, т.Е.
return ActiveItem == button1ViewModel ?
(Style) App.Current.Resources["Button1ActiveStyleKey"] :
(Style) App.Current.Resources["Button1InactiveStyleKey"];
это означало бы, что ваша ViewModel будет знать о стилях, которые вам могут не понадобиться. Если это так, вторым вариантом было бы написать Caliburn.Micro IResult
, который изменяет стиль кнопки и возвращает 3 из них (по одному для каждой кнопки) из сопрограммы, которая вызывается нажатием кнопки, т.Е.
public IEnumerable<IResult> ButtonOneClicked()
{
yield return new ChangeButtonStyle("Button1Name", "Button1ActiveStyleKey");
yield return new ChangeButtonStyle("Button2Name", "Button2InactiveStyleKey");
yield return new ChangeButtonStyle("Button3Name", "Button3InactiveStyleKey");
}
Реализация ChangeButtonStyle IResult
выполняла бы поиск в представлении (предоставляемом через ActionExecutionContext
параметр to IResult.Execute
) элемента управления с именем, указанным в 1-м параметре ChangeButtonStyle
ctor, а затем устанавливала свойство style этого элемента управления, используя ключ ресурса, предоставленный в качестве 2-го параметра ChangeButtonStyle
ctor.
Ответ №3:
Вы можете использовать
<Trigger Property ="IsPressed" Value ="True">
Я думаю, что это делает свое дело…