2017-01-25 1 views
0

Может быть, я что-то очевидное отсутствует, но я не могу понять это ... У меня есть стиль кнопки, определенный в 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

+0

связать свойство текста кнопки на логическое значение в бизнес-данных, затем используйте IValueConverter для передачи соответствующего текста. https://www.wpftutorial.net/ValueConverters.html – Bubba

+0

Ваша кнопка (и стиль кнопки) не должна иметь бизнес-логики для динамического задания текста, исходя из некоторой озабоченности за пределами кнопки. Как сказал Бубба, вы можете привязать текст к элементу кнопки и запустить его через конвертер. Таким образом, вы можете повторно использовать стиль кнопки. Например: '

+0

Спасибо за вклад, ребята ... По крайней мере, я знаю, что я не был просто что-то с XML. –

ответ

0

Можно ли переопределить часть ресурса стиля?

Нет, вы действительно можете базировать стиль на другой стиль и переопределить specfic сеттеры, но вы не можете «переопределить» только часть ControlTemplate. К сожалению, вы должны затем (перо) определить весь шаблон в целом:

WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?

+0

Спасибо, @ mm8. Я ценю отзывы и ссылку. –

0

Я полагаю, я мог бы создать свойство текста в ViewModel, который предоставляет правильный заголовок, но это, кажется, нарушает разделение проблем в MVVM.

Ну, совсем нет. Само название Модель подразумевает модель для просмотра. Конечно, это зависит от нескольких вариантов дизайна, но это не является нарушением MVVM, на мой взгляд.

Кроме того, я бы пошел с DataTrigger (определенный в Style.Triggers), где вы можете установить конкретные строки только для просмотра, учитывая значение вашего логического свойства.

И, пожалуйста, не ходи с двумя кнопками -ного раствора, что ближе к преступление, в связи с которым может быть произведен арест; о)

+0

Думаю, я вижу, откуда вы, @heltonbiker, спасибо. –

Смежные вопросы