WPF 怎么访问主窗体里面的控件 20
做了一个datagridName为dg,单击一个按钮后弹出一个新的窗体,我在窗体里面写了将数据库内容显示到datagrid上,但是会报错:上下文不存在dg,自己摸索下改了...
做了一个datagrid Name为dg,单击一个按钮后弹出一个新的窗体,我在窗体里面写了将数据库内容显示到datagrid上,但是会报错:上下文不存在dg,自己摸索下改了下:var frm = (this.Parent as MainWindow);frm.dg.itemsSource=……也会报错:frm一直为null,该怎么解决
展开
展开全部
新窗体和主窗体不是父子关系,当然找不到。
这两种窗体间的交互我知道的有几种方法
1:设置子窗体的拥有者为主窗体
2:使用一个全局变量,并在变量改变通知主窗体
3:使用Prism的aggregaterg事件,子窗口发布聚合事件,主窗体接收
这两种窗体间的交互我知道的有几种方法
1:设置子窗体的拥有者为主窗体
2:使用一个全局变量,并在变量改变通知主窗体
3:使用Prism的aggregaterg事件,子窗口发布聚合事件,主窗体接收
追问
具体代码呢,不会写
追答
1:例如 MainWindow是主窗体,SubWindow是子窗体
在主窗体中弹出新窗体时
SubWindow sub=new SubWindow();
sub.Owner=this
sub.Show();
这时你在subwindow就可以查找到MainWindow
Window w = this.Owner; 这里的w就是你的主窗体了
DataGrid grid = w.FindName("dg") as DataGrid; 这就是主窗体上的Datagrid控件了,这样你想怎么样就怎么样了
2:有点麻烦就不说了
3:使用前先引用 Microsoft.Practices.Prism.Events;
第一步:在基础模块中定义事件
public class SendTextEvent
: CompositePresentationEvent { }
这里的string只是表示方便,可以是任何类
第二步,在子窗体中发布事件
private IEventAggregator eventAggregator = ServiceLocator.Current.GetInstance(); 这是字段
eventAggregator.GetEvent().Publish(SendMessage);这是你要传递的数据
第三步,订阅事件
IEventAggregator eventAggregator= ServiceLocator.Current.GetInstance();
SubscriptionToken token =
eventAggregator.GetEvent().Subscribe(GetText);;
private void GetText(string obj)
{
//在这里处理你的数据
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询