我正在努力解决WPF绑定的真正好处。
我有一个带有大文本框的应用程序,用于输入数百个字符的用户输入。我已将其绑定到ViewModel中的“Text”字符串。这很好用。
我还有一个内容为“提交”的按钮。我需要更改此按钮的内容一次或两次,所以我在窗口代码后面的click事件方法中执行此操作。当然,我可以将文本绑定到ViewModel,但它真的值得吗?
所有都应该有绑定吗?如果我需要显示MessageBox怎么办?这将在onclick中需要一些逻辑。
应点击以下事件:
private void button_Login_Click(object sender, RoutedEventArgs e)
{
viewModel.DoSomething();
}
..所有东西都交给了ViewModel?
我知道这是一个普遍的问题,但我尽力提出直接的,可回答的问题。
答案 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>