【问题标题】:Datagrid binding in WPFWPF 中的数据网格绑定
【发布时间】:2011-08-14 04:01:09
【问题描述】:

我知道这已经被问过了,但我已经做了开发人员建议的几乎所有事情。

<DataGrid x:Name="Imported" VerticalAlignment="Top"
          DataContext="{Binding Source=list}"
          AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/>
    </DataGrid.Columns>
</DataGrid>

我试图在模态对话框中显示它并在模态对话框的构造函数中填充许可证列表。 但是DataGrid 中仍然没有填充任何内容。

构造函数代码:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
}
public class object
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}

你们觉得对象列表有什么关系吗?

【问题讨论】:

  • 我的列表对象比上面两个没有绑定的属性更多?那会有什么不同吗?
  • 可能不会。请分享更多您的 XAML(包括如何定义 list),以便我们进一步提供帮助。
  • 我已经在顶部添加了代码。
  • @alice7 diagboxclass 是什么类型的? XAML 类containing DataGrid 是什么类型?如果 diagboxclass 在 XAML 文件的代码隐藏中,则应将 list 分配给该类的 DataContext 属性。然后,您应该能够从 XAML 中绑定到列表。
  • 嗨,如果其中一个答案在 2011 年对您有所帮助,请将其标记为答案,谢谢

标签: c# wpf xaml binding datagrid


【解决方案1】:

尝试在后面的代码中这样做:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
    Imported.ItemsSource = null;
    Imported.ItemsSource = list;
}

还要确保您的列表得到有效填充,并且如@Blindmeis 所述,切勿使用已在 C# 中赋予函数的单词。

【讨论】:

    【解决方案2】:

    如果没有看到上述对象列表,我相信您应该绑定到DataGridItemsSource 属性,而不是它的DataContext

    <DataGrid x:Name="Imported" VerticalAlignment="Top"
              ItemsSource="{Binding Source=list}"
              AutoGenerateColumns="False" CanUserResizeColumns="True">
        <DataGrid.Columns>                
            <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
            <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
       </DataGrid.Columns>
    </DataGrid>
    

    (这假定包含 DataGrid 的元素 [UserControl 等] 具有 DataContext 绑定到包含 list 集合的对象。@987654330 @ 派生自 ItemsControl,它依赖于其 ItemsSource 属性来定义将其行绑定到的集合。因此,如果 list 不是绑定到控件的 DataContext 的对象的属性,您可能需要在DataGrid上同时设置DataContext={Binding list}ItemsSource={Binding list})。

    【讨论】:

    • @alice7 然后请发布一些 XAML,显示您的 Window/UserControl/Whatever 包含网格的其余部分,并告诉我们如何定义 list。 :)
    • 我已经删除了整个内容,只是离开了datagrid.so没有其他控件。下面是代码 iside 构造函数: List objectList = new List(); objectList = GetObjectList();
    • 在...的构造函数里面是什么?请编辑您的问题(单击标签下方显示的edit 链接)以包含更多代码;在评论中很难阅读。谢谢:)
    • @alice7:您需要将该列表公开为公共属性并设置适当的 DataContext,您应该阅读this reference
    • ItemsSource 属性中的绑定可能是错误的。就我而言,当我使用“{Binding Source=list}”声明绑定时,我没有成功。但是当我用“{Binding list}”声明绑定时我成功了。
    【解决方案3】:

    请不要使用 object 作为类名:

    public class MyObject //better to choose an appropriate name
    {
        string id;
        DateTime date;
        public string ID
        {
           get { return id; }
           set { id = value; }
        }
        public DateTime Date
        {
           get { return date; }
           set { date = value; }
        }
    }
    

    你应该为这个类实现INotifyPropertyChanged,当然在属性设置器上调用它。否则更改不会反映在您的用户界面中。

    您的Viewmodel 类/对话框类应该有一个Property 属于您的MyObject 列表。 ObservableCollection&lt;MyObject&gt; 是要走的路:

    public ObservableCollection<MyObject> MyList
    {
         get...
         set...
    }
    

    在您的xaml 中,您应该将Itemssource 设置为您的MyObject 集合。 (Datacontext 必须是你的对话框类!)

    <DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
       <DataGrid.Columns>                
         <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
         <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
       </DataGrid.Columns>
    </DataGrid>
    

    【讨论】:

    • 在我的情况下,DataGrid 的 ItemSource 应该是:ItemsSource="{Binding MyList}"
    猜你喜欢
    • 2011-09-28
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2012-07-03
    • 2013-11-14
    相关资源
    最近更新 更多