【问题标题】:Binding a datagrid to the selected item of another datagrid将数据网格绑定到另一个数据网格的选定项
【发布时间】:2012-01-02 15:22:21
【问题描述】:

我有两个 DataGrid。 EmployeeGrid 和 WorkSessionsGrid。每个员工都有一个 WorkSessions 列表,我希望用户通过在 EmployeeGrid 中选择一个项目来访问它,这应该使 WorkSessionsGrid 为所选员工生成 WorkSessions。为什么以下不正确?

<DataGrid Name="dg_2" ItemsSource="{Binding ElementName=dg_1, Path=SelectedItem.WorkSessions}"/>

更新 我得出的结论是,问题必须出在其他层之一。 这是我的代码的其余部分,希望有人能够帮助我。 从根本上说我缺少什么吗?

代码隐藏 xaml

    public partial class MainWindow : Window
{
    public EmployeeViewModel EmployeeViewModel = new EmployeeViewModel();


    public MainWindow()
    {
        InitializeComponent();

        menu_employee.DataContext = EmployeeViewModel;
        sp_employee.DataContext = EmployeeViewModel;
        datagrid_employees.ItemsSource = EmployeeViewModel.EmployeesView;
        sp_worksessions.DataContext = EmployeeViewModel.SelectedEmployee.WorkSessions;
        menu_worksession.DataContext = EmployeeViewModel.SelectedEmployee.WorkSessions;
        datagrid_worksessions.ItemsSource = EmployeeViewModel.SelectedEmployee.WorkSessions;

    }
}

WorkSessionViewModel

class WorkSessionViewModel : ViewModelBase
{
    private WorkSessions _workSessionsModel = new WorkSessions();
    public WorkSessions WorkSessionsView = new WorkSessions();

    private WorkSessionModel _selectedWorkSession = new WorkSessionModel();
    public WorkSessionModel SelectedWorkSession
...

WorkSessionModel

[Serializable]
public class WorkSessions : ObservableCollection<WorkSessionModel>
{
    public WorkSessions()
    {

    }
}
[Serializable]
public class WorkSessionModel : INotifyPropertyChanged
{
    private DateTime _dateTime;
    private string _id;
    private double _hours;
    public WorkSessionModel()
    {
    }

【问题讨论】:

  • 不正确是指这不起作用?
  • 是的,这不起作用。我想也许我的错误在于我的 EmployeeViewModel。我的 Viewmodel 有一个 public ObservableCollection WorkSessions { get; 是否正确?放; } ?
  • @litemode : 很抱歉很晚才回复.. 我面临一个类似的问题.. 你最终解决了这个问题吗?请回复。

标签: c# wpf data-binding mvvm


【解决方案1】:

尝试绑定到元素。

<DataGrid Content="{Binding ElementName=ListOfEmp, Path=SelectedItem.Name}" DataContext="{Binding}" />

【讨论】:

    【解决方案2】:

    这部分 XAML 看起来很正确,请尝试 debug the binding,可能还有其他一些问题,例如可视树中断或 WorkSessions 集合可能是字段而不是属性等。

    如果有绑定错误,请分享。

    【讨论】:

    • WorkSessions 应该是模型层中的公共 ObservableCollection 吗?
    • @litemode:它应该是一个公共的property,在你绑定到的任何层上(即在任何SelectedItem 上)。你调试了吗,你得到了什么绑定错误?
    • 我放弃了尝试调试它。在这一点上,我根本无法接受一个全新的概念,例如调试绑定。
    • @litemode:为什么?基础非常简单,您只需要运行应用程序,切换到输出窗口并检查它是否存在绑定错误。
    【解决方案3】:

    作为@H.B.已正确指出,请使用 Visual Studio 的输出窗口查看任何绑定错误。他们会告诉你绑定是否失败。如果您发现绑定错误,那么您的绑定应该解决两个可能的问题...

    1. 数据源不正确。是否为该 UI 元素(例如 DataGrid)正确设置了数据上下文和项目源?
    2. 绑定中属性的路径可能不正确。你的SelectedItem 有一个对象,其中有任何名为WorkSessions 的属性吗?等

    除此之外,我们仍然不知道您的 XAML 中的 dg_1dg_2 是什么。我猜你后面的代码显示了不同的名称datagrid_employeesdatagrid_worksessions

    【讨论】:

      【解决方案4】:

      您应该为 EmployeeViewModel 添加一个名为:SelectedEmployee 的项目,并将其与员工网格选定项目绑定,mode=TwoWay。

      那么你为第二个网格绑定的数据应该是:

      <DataGrid Name="dg_2" ItemsSource="{Binding Path=SelectedEmployee.WorkSessions}"/>
      

      由于两个网格都在同一个窗口中,因此,您应该只为窗口设置数据上下文。在视图模型中,您有 2 个依赖属性:EmployeeList、SelectedEmployee。而 EmployeeList 绑定到员工网格的 ItemsSource。 SelectedEmployee 绑定到员工网格上的 SelectedItem。

      【讨论】:

        猜你喜欢
        • 2013-03-28
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 2016-07-19
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多