【问题标题】:How to save WPF textbox value to variable如何将 WPF 文本框值保存到变量
【发布时间】:2019-07-09 12:24:30
【问题描述】:

我正在尝试制作一个基于 WPF 的程序,该程序将从用户控件读取文本框输入(用户输入)并将其保存为 object 属性。用户控件添加到MainWindow。在MainWindow 中,您有一个按钮,它显示一个带有文本框值的消息框。我不确定如何将它们全部连接起来。

错误 = CS0103 当前不存在名称“minJpValue” 上下文 WpfApp1

请帮忙

  1. (用户控件 .xaml 代码)

    <TextBox x:Name="minJpValue"/>
    
  2. (自定义类)

    public class jpData 
    {
        public double minJpValue
        {
            get { return minJpValue; }
            set { minJpValue = value; }
        }
    }
    
  3. (主窗口.cs代码)

    private void clickclick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(minJpValue);
    }
    

【问题讨论】:

  • 首先你应该在自定义类世界中添加 return minJpValue.Text minJpValue.Text = value 因为你想要 Text 值
  • 您可能应该启动一个没有 UserControl 的简单 WPF 应用程序。然后逐步学习,也许可以借助 WPF 书籍,例如Adam Nathan 的“WPF Unleashed”。
  • 如果您在窗口的 XAML 标记中为 UserControl 元素指定一个 x:Name,例如“uc”,您可以使用 uc.minJpValue 访问 TextBox 的值。
  • 这也可以帮助您stackoverflow.com/questions/1806795/… 并检查文本框公共属性
  • 我建议您先从基本的控制台应用程序开始,这样您就可以了解操作对象的技巧以及如何访问对象成员(例如字段、属性、方法)。只有在您掌握了基础知识之后,才开始学习 WPF(或您选择的任何其他 UI 工具包)。我担心你现在已经做了很多事情,需要你一次学习很多东西才能编译一个简单的程序,更难的是,要正常工作......

标签: c# wpf


【解决方案1】:

使用 MVVM 模式可以轻松解决该问题, 用户控件的代码将与此类似

<Grid Background="Red">
    <TextBox x:Name="minJpValue" Text="{Binding Path=minJpValue}" />
</Grid>

为 MainWindow 创建新的 ViewModel,如下所示

public class MainWindowViewModel : INotifyPropertyChanged
{
    /// <summary>
    /// Property Changed Event Handler
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    // Create the OnPropertyChanged method to raise the event
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
   private String _minJpValue;
    public String minJpValue {
        get { return _minJpValue; }
        set {
            _minJpValue = value;
            OnPropertyChanged(nameof(minJpValue));
        }
    }

}

将用户控件添加到您的 MainWindow 视图中,并在代码隐藏中将 datacontext 设置为 ViewModel,如下所示

 public MainWindowViewModel CurrentModel = new MainWindowViewModel();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = CurrentModel;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(CurrentModel.minJpValue);
    }

这可以解决您当前的问题。请查看它是否按预期工作。

【讨论】:

  • 谢谢 Ashok,onpropertychanged 事件是对我有用的解决方案
【解决方案2】:

对于这个快速修复使用:

 MessageBox.Show(minJpValue.Text);

但更好的方法是将值存储在VM(视图模型)上,并使用 MVVM 模式将控件绑定到它。我提供了一个关于

的基本示例

Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding

【讨论】:

  • 他提到 minJpValue 处于用户控制之下,他想在 MainWindow 中显示它,我认为这行不通。
【解决方案3】:

好吧,让我们了解一下您是否做错了。

&lt;TextBox Name="minJpValue"/&gt;

这一行将为 TextBox 创建一个对象,该对象将使用您的名称引用 minJpValue 正如你所提到的,这将在另一个 Usercontrol 对象中,你尝试在 MainWindow 中使用 minJpValue 它怎么知道像 minJpValue 这样的东西存在

答案如下:

objjpData.minJpValue = minJpValue.Text;//Inside user control when ever u change the `minJpValue` u need to set it too bjjpData.minJpValue

将此objjpData 传递到主窗口或您想要访问的地方

MessageBox.Show(objjpData.minJpValue);

选项 2: MessageBox.Show(UserControlObject.minJpValue.Text);

还有 PS:检查一次 MVVM

【讨论】:

  • 什么是objjpData 以及如何将它传递到主窗口?我认为这是解决这个问题的关键。无论您使用VisualTreeHelper 还是Binding(例如RelativeSource FindAncestor)来获取父主窗口,您都必须至少使用主窗口一个属性,例如string 类型。从TextBox 获取文本是我想说的“明显”部分。
  • @BionicCode U 可以在主窗口中创建一个objjpData 并将其传递给用户控件。这完全取决于他的代码。而且我真的不认为他在使用绑定。我不想让答案复杂化
  • 为了提供一个可行的解决方案,我建议将string 类型的DependencyProperty 添加到名为MainWindowMainWindow。然后使用{RelativeSource FindAncestor, AncestorType MainWindow}UserControl 中的TextBox 绑定到此属性。将属性 chanegd 回调添加到将显示消息的新 Message 属性。
  • 是的,好的。但我不认为你的例子会有所帮助。它不能解决问题。您将文本包装到一个变量中,而不是直接传递它。这不是解决方案。
  • @BionicCode 他希望该变量中的数据太正确(在问题中提到(how-to-save-wpf-textbox-value-to-variable)),所以我这样提到。如果有更好的答案,请添加它,即使我很乐意阅读它
猜你喜欢
  • 1970-01-01
  • 2016-10-25
  • 2017-04-21
  • 2018-06-15
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多