2

我想将一个值从 MainWindow 传递到我的 UserControl!我向我的 UserControl 传递了一个值,并且 UserControl 向我显示了 MessageBox 中的值,但它没有显示 TextBox 中的值。这是我的代码:

MainWindow(将值传递给 UserControl)

try
{
    GroupsItems abc = null;
    if (abc == null)
    {
        abc = new GroupsItems();
        abc.MyParent = this;
        abc.passedv(e.ToString(), this);

    }
}
catch (Exception ee)
{
    MessageBox.Show(ee.Message);
}

用户控制

public partial class GroupsItems : UserControl
{
    public MainWindow MyParent { get; set; }
    string idd = "";
    public GroupsItems()
    {
        InitializeComponent();
        data();
    }

    public void passedv(string id, MainWindow mp)
    {
        idd = id.ToString();
        MessageBox.Show(idd);
        data();
    }

    public void data()
    {
        if (idd!="")
        {
            MessageBox.Show(idd);
            texbox.Text = idd;
        }
    }
}

编辑(使用 BINDING 和 INotifyProperty )

......

   public GroupsItems()
      {
            InitializeComponent();
      }

    public void passedv()
    {
        textbox1.Text = Text;
    }

}

public class Groupitm : INotifyPropertyChanged
{

    private string _text = "";

    public string Text
    {
        get { return _text; }
        set
        {
            if (value != _text)
            {
                _text = value;
                NotifyPropertyChanged();
            }
        }
    }



    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
4

4 回答 4

4

这里的问题是有参考的。

当您在后面的代码中创建新对象时,将创建新对象,这与您在 xaml 代码中拥有的对象不同。所以你应该使用以下代码:

<local:GroupsItems x:Name="myGroupsItems"/>

并且在后面的代码中您不必创建新对象。您应该使用在 XAML 中添加的对象:

...
myGroupsItems.MyParent = this;
myGroupsItems.passedv(e.ToString(), this);
...

是示例解决方案(sampleproject)。

于 2013-10-26T17:07:56.330 回答
0

在您的Binding示例中,您的GroupItem类看起来不错,只是您需要传入更改后的属性的名称:

    public string Text
    {
        get { return _text; }
        set
        {
            if (value != _text)
            {
                _text = value;
                NotifyPropertyChanged("Text");
            }
        }
    }

现在,在 中GroupsItems,您不应该访问TextBox. 在 WPF 中,我们操作的是数据,而不是 UI……但是当我们使用Binding对象将数据绑定到 UI 控件时,它们会自动更新(如果我们正确实现了INotifyPropertyChanged接口)。

INotifyPropertyChanged因此,首先,让我们像在类中所做的那样,在后面的代码中添加一个数据属性(它也应该实现接口) GroupItem

private GroupItem _item = new GroupItem();

public GroupItem Item
{
    get { return _item; }
    set
    {
        if (value != _item)
        {
            _item = value;
            NotifyPropertyChanged("Item");
        }
    }
}

现在让我们尝试BindingTextBox.Text属性上使用 a:

<TextBox Text="{Binding Item.Text}" />

看看我们如何将Text你的GroupItem类的属性绑定到TextBox.Text属性...现在我们需要做的就是改变Item.Text属性的值并在 UI 中观察它的更新:

<Button Content="Click me" Click="Button_Click" />

...

private void Button_Click(object sender, RoutedEventArgs e)
{
    Item.Text = "Can you see me now?";
}

passedv或者,如果您在项目的其他地方调用该代码,则可以将此代码放入您的方法中。让我知道你是怎么办的。


更新>>>

在您的GroupItem课程中,尝试将初始化更改为:

private string _text = "Any text value";

当您运行应用程序时,您现在可以在 UI 中看到该文本吗?如果没有,请尝试将整个Text属性添加/复制到您的代码中并将TextBox声明更改为:

<TextBox Text="{Binding Text}" />

如果你现在看不到文本值,你真的有问题......你已经INotifyPropertyChanged在你的代码中实现了接口,不是吗?

于 2013-10-22T11:48:14.027 回答
0

尝试这个:

public partial class GroupsItems : UserControl
{
   //properties and methods

    private string idd="";

    public string IDD
    {
    get{return idd;}
    set{
        idd=value; 
        textBox1.Text=idd;
        }
    }

   //other properties and methods
}

用法:

在您的主要形式中:

    abc = new GroupsItems();
    abc.IDD="sometext";
    MainGrid1.Children.Add(abc);   //Grid or any other container for your UserControl
于 2013-10-22T10:27:20.717 回答
0

当仍然是导致文本框仍然为空时,您data在构造函数中调用。更改属性不会改变这一点。只会。但是此时您没有父集。打个电话也行。idd""MyParentpassedvdatapassedv

于 2013-10-22T10:01:05.927 回答