【问题标题】:Bind a WPF mainWindow TextBox to a variable calculated in a user control C#将 WPF mainWindow TextBox 绑定到在用户控件 C# 中计算的变量
【发布时间】:2011-03-07 09:04:34
【问题描述】:

我的主窗口上有一个文本框,我有一个带有图像(位图)的用户控件。通过鼠标单击图像,计算出一个值。该值应显示在主窗口的文本框中。 1) 无数据绑定 如何从用户控件访问主窗口上的 textBox 对象。它以相反的方式工作,即我可以使用用户控件的名称和文本框从主窗口访问用户控件文本框,以访问文本框,例如 usercontrol1.textBoxName。 但在我看来,我无法从用户控件访问主窗口文本框,例如 mainWindow.textBoxName,因为用户控件不知道主窗口并且没有主窗口对象。这个对吗? 2) 带数据绑定 它可能适用于数据绑定。但是到目前为止我尝试的方法没有奏效。在 XAML 主窗口中:

TextBox  Text="{Binding Path=usercontrol1.GetCycleNumber()}"   Name="cycleNumberBox" 

在 mainWindow.cs 中:

public partial class MainWindow : Window , INotifyPropertyChanged 

我添加了 INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
private  void RaisePropertyChanged(string propertyName)
  {
      PropertyChangedEventHandler handler = this.PropertyChanged;
      if (handler != null)
        {
          handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public  void CycleChanged()
    {
      this.cycleNumber = usercontrol1.GetCycleNumber();
            if (this.cycleNumberBox.Text != cycleNumber)
            {
              this.cycleNumberBox.Text = cycleNumber;
               RaisePropertyChanged("cycleNumber");

         }

  }

usercontrol1.cs 现在我必须用

来表示改变
RaisePropertyChanged("cycleNumber"); 

在用户控件中。但是,我无法访问此方法。 由于我已经花了几天的时间来解决这个问题,所以我很乐意提供任何帮助。 我是初学者,这是我的第一个项目。谢谢!

【问题讨论】:

  • 绑定用户控件有点棘手,你有googled 吗?希望有所帮助!
  • 我立即想到的2种可能性:一种肮脏的方式和一种更干净的方式:如果您喜欢肮脏的方式,请在创建时将主窗口传递给用户控件的构造函数(如果您在代码中创建它) .干净的方式:使用委托
  • @Morvader 感谢您提供非常好的链接!

标签: wpf user-controls binding


【解决方案1】:

如果您的用户控件需要与主窗口(或用户控件的任何容器)共享一条数据,则最好使用数据绑定。

  1. 在用户控件上公开依赖属性。在您的情况下,它看起来像 CycleNumber。

在内部,用户控件可以根据需要使用这个依赖属性。如果是计算字段,可能需要使用 RegisterReadOnly() 方法注册依赖属性。

2a。要让其他控件访问 CycleNumber 中的值,您可以使用 ElementBinding 绑定到依赖属性,或者

2b。将依赖属性绑定到 ViewModel 中的值(或其他结构,如果您不遵循 MVVM 模式)。

如果你还需要继续,我可以为你提供一些示例代码。

希望对您有所帮助。 塞尔吉奥

【讨论】:

  • 很高兴得到您的帮助。我只是想弄清楚依赖属性是如何工作的。 CycleNumber 是在用户控件中计算和更改的字符串,该值应显示在主窗口的文本框中。在用户控件中,我将其命名为 splitMethodControl:
  • public static DependencyProperty ValueProperty = DependencyProperty.Register("cycleNumber", typeof(String), typeof(SplitMethodControl)); public String cycleNumber { get { return (String)GetValue(SplitMethodControl.ValueProperty); } set { SetValue(SplitMethodControl.ValueProperty, value); } }
  • mainwindow.xaml 中的文本框:
  • 我想如果我更改cycleNUMber,例如cycleNumber = wavegramPixel.ToString();,我会在文本框中看到它,但在文本框中什么都没有。我错过了什么?谢谢!
  • 它有效!!!!!!!非常感谢大家!我真的很着迷 :-) 这是我第一次提出问题,我得到了很多帮助。我希望我将来能够帮助其他人。
猜你喜欢
  • 2016-01-02
  • 2017-03-07
  • 1970-01-01
  • 2018-11-21
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多