根据先前的点击更改按钮内容和文本

12

我希望根据之前的内容点击更改按钮内容。例如,如果它是Add,则应将其更改为Save,如果它是Save,则应将其更改回Add

我知道如何更改按钮的内容。但是如何读取内容以进行更改呢?

5个回答

16

如果您正在使用MVVM,请将内容绑定到一个值并将命令绑定到一个函数。

<Button Content="{Binding ButtonText}" Command="{Binding ButtonClickCommand}"/>

当然,此时你的ViewModel中将有字符串类型的属性ButtonText和ButtonClickCommand。

private string _ButtonText;
public string ButtonText
{
    get { return _ButtonText ?? (_ButtonText = "Add"); }
    set
    { 
        _ButtonText = value;
        NotifyPropertyChanged("ButtonText"); 
    }
}

private ICommand _ButtonClickCommand;
public ICommand ButtonClickCommand
{
    get { return _ButtonClickCommand ?? (_ButtonClickCommand = _AddCommand); }
    set
    {
        _ButtonClickCommand = value;
        NotifyPropertyChanged("ButtonClickCommand");
    }
} 

private ICommand _AddCommand = new RelayCommand(f => Add());
private ICommand _SaveCommand = new RelayCommand(f => Save());

private void Add()
{
    // Add your stuff here

    // Now switch the button   
    ButtonText = "Save";
    ButtonClickCommand = SaveCommand;
}

private void Save()
{
    // Save your stuff here

    // Now switch the button   
    ButtonText = "Add";
    ButtonClickCommand = AddCommand;
}

那么,您可以让ButtonClickCommand更改属性,而绑定会负责一切。


你如何使NotifyPropertyChanged()可访问?你需要实现什么? - rollsch
当我回答这个问题时,我可能已经使用了实现了NotifyPropertyChanged的ViewModelBase。请参见此文章的第2步:http://www.rhyous.com/2010/12/29/a-progress-bar-using-wpfs-progress-bar-control-backgroundworker-and-mvvm/ - Rhyous
1
我建议你在回答中展示这些,例如你正在使用哪些命名空间(显示using语句非常有帮助)以及你正在扩展什么。 - rollsch

13

标记说明

获取或设置一个任意对象值,可用于存储有关此元素的自定义信息。

MSDN链接

或者:

void MyButton_OnClick(object sender, RoutedEventArgs e)
{
    if(mybutton.Content.ToString() == "Add")
    {
        \\ Lines for add
        mybutton.Content = "Save";
    }
    else
    {
        \\ Lines for Save
        mybutton.Content = "Add";    
    }
}

1
这不是在WPF中展示的正确方式,也许可以在WinForms中。 - Alexandru Dicu

7
我同意Surfens的回答,这里的问题不是ToggleButton的完美示例,因为“保存”和“添加”是非常不同的操作,应该在各自按钮上设置自己的“ICommand”。
但是,下面是一些样式,根据ToggleButton的IsChecked值更改内容。
如果按钮未被选中,则内容将为“ValueForUnToggledState”,当选中时,内容将更改为“ValueForToggledState”。
<ToggleButton>
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="ValueForUnToggledState" />
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Content" Value="ValueForToggledState" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

这个答案比其他答案更像WPF。


4
另一种设计方法是创建两个按钮,例如AddButtonSaveButton,然后使用Visibility属性分别显示或隐藏它们。

为什么呢?

因为这是一种关注点分离的方法。例如,在单击处理程序中,您不需要检查您所处的模式,因为您将拥有单独的处理程序。您还希望这些按钮具有不同的图标、不同的工具提示等。


3
您可以使用ToggleButton和EventTriggers来执行选中和未选中状态下的不同方法。
<ToggleButton x:Name="ToggleButton" Content="Add"
              Style="{StaticResource ToggleStyle}"
              IsThreeState="False">
     <i:Interaction.Triggers>
      <i:EventTrigger EventName="Checked">
      <ei:CallMethodAction MethodName="Save" TargetObject="{Binding}" />
     </i:EventTrigger>
     <i:EventTrigger EventName="Unchecked">
       <ei:CallMethodAction MethodName="Add" TargetObject="{Binding}" />
     </i:EventTrigger>
 </i:Interaction.Triggers>
 </ToggleButton>

您可以使用样式来修改ToggleButton模板,并更改选中状态的文本。要做到这一点,请获取ToggleButton样式的副本,并在Checked VisualState中将其添加到故事板中:
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="(UIElement.Content)">
 <DiscreteObjectKeyFrame KeyTime="0">
    <DiscreteObjectKeyFrame.Value>
         Save
    </DiscreteObjectKeyFrame.Value>
   </DiscreteObjectKeyFrame>
 </ObjectAnimationUsingKeyFrames>

如果您不想走那条路,您可以将以下内容添加到您的“已选触发器”中:
<ei:ChangePropertyAction PropertyName="ButtonText" Value="Save"/>

要使用这些方法,您需要引用来自C:\ Program Files(x86)\ Microsoft SDKs \ Expression \ Blend.NETFramework \ v4.5 \ Libraries的Microsoft.Expression.Interactions和System.Windows.Interactivity二进制文件。

在 XAML 中,它们混合了 Microsoft.Expression.Interaction (ei) 和 System.Windows.Interactivity 的命名空间别名。 - santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接