WPF的最佳实践 - 每个GUI元素都需要绑定吗?

时间:2014-08-03 22:10:17

标签: c# wpf mvvm

我正在努力解决WPF绑定的真正好处。

我有一个带有大文本框的应用程序,用于输入数百个字符的用户输入。我已将其绑定到ViewModel中的“Text”字符串。这很好用。

我还有一个内容为“提交”的按钮。我需要更改此按钮的内容一次或两次,所以我在窗口代码后面的click事件方法中执行此操作。当然,我可以将文本绑定到ViewModel,但它真的值得吗?

所有都应该有绑定吗?如果我需要显示MessageBox怎么办?这将在onclick中需要一些逻辑。

应点击以下事件:

private void button_Login_Click(object sender, RoutedEventArgs e)
{
   viewModel.DoSomething();
}

..所有东西都交给了ViewModel?

我知道这是一个普遍的问题,但我尽力提出直接的,可回答的问题。

2 个答案:

答案 0 :(得分:2)

UI关注点非常适合您的代码隐藏。

业务问题应该存在于您的ViewModel中。它们公开的命令和信息应该绑定到UI中的元素。

由于根据按钮应该执行的操作更改按钮中的文本是一个UI问题,因此将按钮文本绑定到ViewModel将毫无意义。

答案 1 :(得分:-1)

我不会在codebehind中添加任何代码。在ViewModel中创建ICommand属性,并将按钮Command属性绑定到它。我使用MVVM Light(RelayCommand)中的ICommand实现,但您可以create your own或使用许多其他框架之一。

然后我有一个State属性(这里是ProcessStatus),我使用DataTrigger来更新我按钮上的文本。

<强>视图模型

public ICommand LoginCommand
{
   get
   {
      return new RelayCommand(() =>
      {
         ProcessStatus = Status.AUTHORIZING;
         DoSomething();
      });
   }
}

private Status _processStatus;
public Status ProcessStatus
{
   get { return _processStatus; }
   set
   {
      if (value ==_processStatus)
         return;
      _processStatus= value;
      RaisePropertyChanged("ProcessStatus");
   }
}

查看

<Button Command="{Binding LoginCommand}">
   <Button.Style>
      <Style TargetType="{x:Type Button}">
         <Setter Property="Content"
                 Value="Submit" />
         <Setter Property="IsEnabled"
                 Value="True" />
         <Style.Triggers>
            <DataTrigger Binding="{Binding ProcessStatus}"
                         Value="{x:Static enum:Status.AUTHORIZING}">
               <Setter Property="Content"
                       Value="Authorizing..." />
               <Setter Property="IsEnabled"
                       Value="False" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </Button.Style>
</Button>