WPF Button内容绑定

时间:2014-09-26 08:54:41

标签: c# wpf xaml

我确信这个问题的解决方案很明显,但我无法弄明白。我试着在SO上找到的每一个答案都没有希望。

问题

我有一个简单的WPF表单,其中包含一个按钮。按钮的文本由视图模型定义,该视图模型在单击时更改文本内容。为了完整起见,下面是我的xaml和后面的视图模型。

XAML:

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vms="clr-namespace:MyVm"
        Height="163.762" Width="201.758" WindowStyle="ToolWindow" ResizeMode="NoResize" Topmost="True" WindowStartupLocation="CenterScreen">
    <Window.DataContext>
        <vms:MyVm />
    </Window.DataContext>
    <Button Name="Action" Content="{Binding Path=NextAction, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Margin="0" MinHeight="50" FontWeight="Bold" FontSize="16" Click="Action_Click"></Button>
</Window>

视图模型:

public class MyVm: INotifyPropertyChanged
{
    private String _nextAction = "START";
    public String NextAction {
        get { return _nextAction; }
        set
        {
            _nextAction = value;
            OnPropertyChanged("NextAction");
        }

    }

    public void ExecuteAction()
    {
        if (_nextAction == "START")
            NextAction = "STOP";

        if (_nextAction == "STOP")
            NextAction = "START";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

问题

当我点击按钮时,我希望文本从&#34; START&#34;到&#34;停止&#34;反之亦然。

  • 视图模型中的逻辑似乎工作正常。
  • 正确调用OnPropertyChanged
  • handler内的OnPropertyChanged不是null

单击该按钮对UI没有影响。我做错了什么?

1 个答案:

答案 0 :(得分:3)

以下逻辑不正确......

public void ExecuteAction()
    {
        if (_nextAction == "START")
            NextAction = "STOP";

        if (_nextAction == "STOP")
            NextAction = "START";
    }

应该是......

public void ExecuteAction()
    {
        if (_nextAction == "START") {
            NextAction = "STOP";
        } else {
            NextAction = "START";
        }
    }

您正在更改下一个要停止的操作,然后以下几行代码会立即再次将其更改回来。