Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未将值传递给grid itemsource的UserControl_C#_Wpf_User Controls - Fatal编程技术网

C# 未将值传递给grid itemsource的UserControl

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的

我正在尝试在网格中创建一个用户控件,该控件接受一个值并执行一个操作:

网格:

但是MessageBox返回的工作ID为0。 我检查了项目源,它正在将正确的值传递给WorkID

编辑:

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,看到所有正确的值。