【问题标题】:Accessing a TextBox through Viewmodel and Binding [closed]通过 Viewmodel 和绑定访问 TextBox [关闭]
【发布时间】:2015-08-21 18:43:53
【问题描述】:

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

已编辑

【问题讨论】:

  • 您至少应该列出您尝试过的几项,以便我们了解您的知识水平。因为简单的答案是:“它们是类。你可以用它们做各种类的事情”。但是,如果您要给我们列出您尝试过的内容,那么您不了解 OO 编程的哪些部分可能会变得很明显。
  • 我希望你感觉好多了。但这里有一个自学的建议。在尝试编写 WPF 之前,请先学习基本的面向对象编程概念。几乎所有 WPF 示例或教程都假定您了解 OOP 的基础知识,但它们不会教您这些基础知识。同时,WPF 假定您已经了解基础知识。这实际上是一个非常简单的问题,在 WPF,或 WinForms,或 ASP.NET 中。总是一样的答案。
  • 有一本关于 C# 编程语言的完整手册。在询问有关语言语法的基本问题之前,您应该先查看它。见C# Programming Guide。详细参考请见C# Reference
  • 我们宁愿帮助你也不愿回答问题
  • 您提出这个问题的事实证明您没有了解一些基础知识。你甚至是什么意思“在它自己的班级”?您是在谈论用户控件,但可能不知道这个术语?

标签: c# wpf class mvvm textbox


【解决方案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());
    }
}

您可以选择在该命令参数中发送其他内容。认为流程尊重您的需求。随意玩一会儿。

【讨论】:

  • @noodles 如果您使用后面的代码,确实可以轻松处理 Button 的 Click 事件,但之后您需要一种方法来调用驻留在另一个类中的 FeedbackPanel(string text)。这还不是全部,您仍然需要一种方法来回到您的 TextBox。您可以在 MainWindow 中定义将接收字符串参数并使用其名称直接调用 TextBox 的方法,或者选择与 TextBox 的 Text 属性绑定的 DepdendencyProperty 以与更新保持同步。总的来说,我建议您开始使用MVVM。
猜你喜欢
  • 2023-03-19
  • 2011-04-18
  • 1970-01-01
  • 2012-09-17
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多