我创建了一个C#WPF程序,其中我有一个TextBox
。我希望此TextBox
使用viewmodel
提供有关事件的反馈。
简化示例:单击按钮时,TextBox
显示"...Button clicked"
。
我目前在后面的代码中有它:
public partial class MainWindow : Window
{
//.....
public void FeedbackPanel(string text)
{
if (FeedbkPanelTextBox != null)
{
if (text != null)
{
FeedbkPanelTextBox.AppendText(text + "\n");
}
else
{
FeedbkPanelTextBox.AppendText("Null\n");
}
}
else
{
return;
}
}
}
如何将此代码移至viewmodel
并在view
中使用绑定?
被修改
答案 0 :(得分:1)
快速示例:
<Window x:Class="ButtonClickedFeedbackICommand.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ButtonClickedFeedbackICommand"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.DataContext>
<local:ViewModel/>
</Grid.DataContext>
<StackPanel Orientation="Horizontal">
<TextBox x:Name="tbFeedback"
Text="{Binding ClickedFeedback}"
MinWidth="50"
Background="SlateGray"
VerticalAlignment="Center"/>
<Button Content="Click"
Command="{Binding TestCommand}"
CommandParameter="{Binding ElementName=tbFeedback, Path=Text}"
VerticalAlignment="Center" />
</StackPanel>
</Grid>
这是你的观点。为了支持您所说的内容,我们需要一种与其他类进行通信的方式。我们的按钮将使用命令和CommandParameter,它将利用对TextBox的Text属性的访问。
这是您的简单ViewModel:
public class ViewModel
{
public ICommand TestCommand { get; set; }
public ViewModel()
{
TestCommand = new TestCommand(this);
}
public void FeedbackPanel(string text)
{
if (text != null)
{
if (text != null)
{
text += (text + "\n");
}
else
{
text += ("Null\n");
}
}
else
{
return;
}
}
}
}
命令:
public class TestCommand : ICommand
{
public ViewModel _vm { get; set; }
public TestCommand(ViewModel vm)
{
_vm = vm;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
_vm.FeedbackPanel(parameter.ToString());
}
}
您可以选择在该CommandParameter中发送另一个东西。认为流程尊重您的需求。随意玩一会儿。