Содержимое кнопки при изменении

#c# #wpf #button #mvvm

#c# #wpf #кнопка #mvvm

Вопрос:

У меня есть приложение WPF-MVVM` и я связываю содержимое своих кнопок с ViewModel. Иногда случается, что новое содержимое содержит текст внутри «()».

    <Button Grid.Row="0" Content="{Binding UnfinishedText}"
                            FontSize="22" Grid.Column="7"
                            Height="Auto" Foreground="White"
                            Style="{StaticResource MaterialDesignToolButton}"
                            Command="{Binding ShowUnfinishedProcedures}"
                            CommandParameter="{Binding ElementName=MainWindow}"/>


 public string ToDoText
        {
            get { return _toDoText; }
            set
            {
                _toDoText = value;
                RaisePropertyChanged("ToDoText");
            }
        }
  

Допустим, я привязал новое содержимое: «Привет (60)». Можно ли изменить передний план в этом примере только для текста в скобках?

Я планировал использовать Button.ContentChanged событие` но его не существует.

Кто-нибудь может мне помочь?

Ответ №1:

Дополнение к предложению Алекса.

Создайте два свойства в вашей модели представления, одно для текста и одно для значения внутри скобок.

вот сообщение и подсчет, например.

Свяжите два свойства` как показано ниже, чтобы упростить его.

  <Button.Content>
    <TextBlock>
        <Run Text="{Binding Message}"/>(            
        <Run Text="{Binding Count}" Style="{StaticResource SomeStyle}"/>)            
    </TextBlock>
 </Button.Content>
  

Также вы можете добавить некоторый статический текст, если требуется.

     <TextBlock>
        <Run Text="StatiContent" Foreground="Blue"/>
        <Run Text="{Binding Message}"/>(            
        <Run Text="{Binding Count}" Style="{StaticResource SomeStyle}"/>)            
    </TextBlock>
  

Ответ №2:

В WPF вы можете вкладывать TextBlock их и применять к ним разные стили и привязки.

Итак, в вашей ViewModel у вас может быть два отдельных свойства, каждое из которых привязано к другому TextBlock со своим собственным стилем:

 private string _message = null;
public string Message
{
    get
    {
        return _message;
    }
    set
    {
        if (_message == value)
        {
            return;
        }

        _message = value;
        RaisePropertyChanged(() => Message);
    }
}

private int _count = 0;
public int Count
{
    get
    {
        return _count;
    }
    set
    {
        _count = value;
        RaisePropertyChanged(() => Count);
    }
}
  

XAML:

 <Button Grid.Row="0"
        FontSize="22" Grid.Column="7"
        Height="Auto" Foreground="White"
        Style="{StaticResource MaterialDesignToolButton}"
        Command="{Binding ShowUnfinishedProcedures}"
        CommandParameter="{Binding ElementName=MainWindow}">
    <Button.Content>
        <TextBlock><TextBlock Text="{Binding Message}" /> (<TextBlock Text="{Binding Count}" Style="{StaticResource CountTextBlockStyle}" />)</TextBlock>
    </Button.Content>
</Button>