我想将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));
}
}
答案 0 :(得分:3)
这里的问题是参考。
当你在后面的代码中创建新对象时,将创建新对象,这与xaml代码中的对象不同。所以你应该使用以下代码:
<local:GroupsItems x:Name="myGroupsItems"/>
并且在后面的代码中你不必创建新对象。您应该使用在XAML中添加的对象:
...
myGroupsItems.MyParent = this;
myGroupsItems.passedv(e.ToString(), this);
...
Here是示例解决方案(sampleproject)。
答案 1 :(得分:0)
当data
仍为idd
时,您在构造函数中调用了""
,这导致文本框仍为空。更改MyParent
属性不会改变这一点。只有passedv
。但是那时你没有父集。也可以在data
中拨打passedv
。
答案 2 :(得分: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
答案 3 :(得分:0)
在Binding
示例中,您的GroupItem
类看起来没问题,只需要传入已更改属性的名称:
public string Text
{
get { return _text; }
set
{
if (value != _text)
{
_text = value;
NotifyPropertyChanged("Text");
}
}
}
现在,在GroupsItems
中,您不应该访问TextBox
。在WPF中,我们操纵数据,而不是UI ......但是当我们使用Binding
个对象将数据绑定到UI控件时,它们会自动更新(如果我们正确实现{{1},则为 } interface )。
首先,让我们在您的代码中添加一个数据属性(也应该实现INotifyPropertyChanged
接口),就像在INotifyPropertyChanged
类中一样:
GroupItem
现在让我们尝试在private GroupItem _item = new GroupItem();
public GroupItem Item
{
get { return _item; }
set
{
if (value != _item)
{
_item = value;
NotifyPropertyChanged("Item");
}
}
}
属性上使用Binding
:
TextBox.Text
了解我们如何将<TextBox Text="{Binding Item.Text}" />
类的Text
属性绑定到GroupItem
属性...现在我们需要做的就是更改TextBox.Text
的值在UI中更新属性并观察它:
Item.Text
或者,如果您在项目的其他地方调用此代码,则可以将此代码放入<Button Content="Click me" Click="Button_Click" />
...
private void Button_Click(object sender, RoutedEventArgs e)
{
Item.Text = "Can you see me now?";
}
方法中。让我知道你是怎么过的。
更新&gt;&gt;&gt;
在passedv
课程中,尝试将初始化更改为:
GroupItem
现在可以在运行应用程序时在UI中看到该文本吗?如果没有,请尝试将整个private string _text = "Any text value";
属性添加/复制到您的代码中,并将Text
声明更改为:
TextBox
如果您现在看不到文本值,那么您确实遇到了问题......您已经在您的代码中实现了<TextBox Text="{Binding Text}" />
接口,不是吗?< / p>