通过Viewmodel和Binding访问TextBox

时间:2015-06-07 03:47:43

标签: c# wpf class mvvm textbox

我创建了一个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中使用绑定?

被修改

1 个答案:

答案 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中发送另一个东西。认为流程尊重您的需求。随意玩一会儿。