C# 未将值传递给grid itemsource的UserControl
我正在尝试在网格中创建一个用户控件,该控件接受一个值并执行一个操作: 网格: 但是MessageBox返回的工作ID为0。 我检查了项目源,它正在将正确的值传递给WorkID 编辑:C# 未将值传递给grid itemsource的UserControl,c#,wpf,user-controls,C#,Wpf,User Controls,我正在尝试在网格中创建一个用户控件,该控件接受一个值并执行一个操作: 网格: 但是MessageBox返回的工作ID为0。 我检查了项目源,它正在将正确的值传递给WorkID 编辑: public主窗口() { 初始化组件(); 列表测试=新列表(); test.Add(新的DataItem1() { 工作ID=292 }); Grid1.ItemsSource=测试; } 我认为放置在Dependency属性中的值具有整数数据类型的字符串值,这可能是一个问题。我假设您在ActionNotes的
public主窗口()
{
初始化组件();
列表测试=新列表();
test.Add(新的DataItem1()
{
工作ID=292
});
Grid1.ItemsSource=测试;
}
我认为放置在Dependency属性中的值具有整数数据类型的字符串值,这可能是一个问题。我假设您在ActionNotes的构造函数中调用MessageBox.Show(),以进行调试,您不打算将其保留在生产代码中。(:>)
无论如何,在构造函数中的点调用MessageBox.Show方法会导致抛出System.InvalidOperationException
我相信抛出此异常是为了停止WPF中一些棘手的重入问题
在Dispatcher.InvokeAsync中包装对Show方法的调用,以允许Dispatcher解决问题。此时,我可以看到WorkID值
public ActionNotes() {
InitializeComponent();
var x = this.WorkID.ToString();
Dispatcher.InvokeAsync(() =>
{
MessageBox.Show(this.WorkID.ToString());
});
}
此外,尚未在构造函数中设置WorkID的值
FWIW,您可以在不使用MessageBox的情况下调试它,在构造函数中放置断点,并在监视窗口或即时窗口中计算this.WorkID
此外,您还没有显示ActionNotes的XAML
<!-- in ActionNotes.xaml -->
需要这一点XAML来查看ActionNotes中的值
<!-- in ActionNotes.xaml -->
在构建用户控件期间不会发生绑定,因此在该阶段不会设置
工作ID
,只能在以后设置。您可以从Loaded
事件中打印消息,此时绑定应该已经发生。此外,您正在更改构造函数中的DataContext
,这可能会导致问题,因此只需将其删除即可。然后,您的构造函数应该如下所示:
public ActionNotes()
{
InitializeComponent();
Loaded += (sender, e) => MessageBox.Show(this.WorkID.ToString());
}
public static readonly DependencyProperty WorkIDProperty =
DependencyProperty.Register("WorkID", typeof(int), typeof(ActionNotes));
public int WorkID
{
get { return (int)GetValue(WorkIDProperty); }
set { SetValue(WorkIDProperty, value); }
}
另一个可能导致问题的原因是您的依赖项属性定义不正确。定义依赖项属性时,必须遵循“PropertyNameProperty”命名约定,并且还应与属性名称保持一致(即不要将WorkId
与WorkId
混用)
记住这些,您的财产声明应该如下所示:
public ActionNotes()
{
InitializeComponent();
Loaded += (sender, e) => MessageBox.Show(this.WorkID.ToString());
}
public static readonly DependencyProperty WorkIDProperty =
DependencyProperty.Register("WorkID", typeof(int), typeof(ActionNotes));
public int WorkID
{
get { return (int)GetValue(WorkIDProperty); }
set { SetValue(WorkIDProperty, value); }
}
我刚刚将数据类型更改为字符串。现在该值是空字符串。@Arm0geddon您在哪里设置了ItemsSource?ItemSource在构造函数中设置。在设置ItemSource之后,我可以在Grid.Items中看到所有的值。这个值并不能使它成为UserControl。你能上传你的文件吗?我编辑了主帖以包含itemsource绑定。Datagrid的itemsource是什么…itemsource是List。我可以遍历Grid.Items,看到所有正确的值。