Может быть, я что-то очевидное отсутствует, но я не могу понять это ... У меня есть стиль кнопки, определенный в app.xml, который представляет «плоский» кнопку ищет:Как создать кнопку, в которой изменения заголовка основаны на логическом в viewmodel, но кнопка основана на ресурсе стиля?
<Style x:Key="FlatButton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="ButtonBorder" BorderThickness="2" BorderBrush="{DynamicResource color_Logo}" Padding="5,3,5,3" HorizontalAlignment="Stretch" Background="White">
<TextBlock x:Name="ButtonText" FontSize="12" Foreground="{DynamicResource color_Logo}" HorizontalAlignment="Center" VerticalAlignment="Center"><ContentPresenter /></TextBlock>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="TextBlock.FontWeight" Value="Bold" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="BorderBrush" Value="Gray" TargetName="ButtonBorder" />
<Setter Property="Foreground" Value="Gray" TargetName="ButtonText" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{DynamicResource color_LogoLight}" TargetName="ButtonBorder"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
отлично работает отлично в моем приложении. Теперь мне нужно создать кнопку с этим стилем, но там, где содержание или подпись кнопки изменяется в зависимости от состояния логического значения в модели viewmodel. Я пробовал несколько итераций, и я либо получил жалобу от компилятора, что свойство стиля уже установлено, либо я просто вижу имя типа объекта в качестве заголовка.
Я полагаю, что я мог бы создать свойство text в viewmodel, которое отображает правильную подпись, но это, похоже, нарушает разделение проблем в MVVM. Хотя я знаю, что это не преступление, связанное с арестом, если я это сделаю, моя модель просмотра не должна заботиться о том, как пользовательский интерфейс что-то представляет, не так ли? Он просто раскрывает состояние объекта, и пользовательский интерфейс принимает решение о том, как его представить.
Другой вариант - создать две кнопки и скрыть ту, которая не подходит, на основе viewmodel boolean. Кажется, что это соответствует шаблону MVVM немного лучше, но я чувствую, что я должен сделать это с помощью триггера на одной кнопке.
Можно ли переопределить часть ресурса стиля?
В настоящее время я собираюсь с двухконтактным решением, но я просто хочу знать, чего мне не хватает.
Спасибо.
J
связать свойство текста кнопки на логическое значение в бизнес-данных, затем используйте IValueConverter для передачи соответствующего текста. https://www.wpftutorial.net/ValueConverters.html – Bubba
Ваша кнопка (и стиль кнопки) не должна иметь бизнес-логики для динамического задания текста, исходя из некоторой озабоченности за пределами кнопки. Как сказал Бубба, вы можете привязать текст к элементу кнопки и запустить его через конвертер. Таким образом, вы можете повторно использовать стиль кнопки. Например: '' –
Спасибо за вклад, ребята ... По крайней мере, я знаю, что я не был просто что-то с XML. –