辅助列表框未显示数据

本文关键字:显示 数据 列表 | 更新日期: 2023-09-27 18:06:01

我有两个列表框与我的视图模型的属性绑定,第一个列表框显示LstEmpresas并且工作良好,当我选择一个项目时,属性SelectedCompany设置良好,所有ok。

在我的视图模型的SelectedCompany的集合中,我调用了一个方法来填充第二个列表(LtsEjercicios),并且工作得很好(LtsEjercicios的填充完全取决于我在第一个列表框中选择的项目)。

第二个列表框从LtsEjercicios对象绑定ItemSource,跨视图模型更新。

但是第二个列表框没有显示任何数据,我已经疯了。

这个viewModel代码

public class frmEmpresasVM : ViewModelBase
{
    //propiedades
    EmpresasDataAccess empresasController = new EmpresasDataAccess();
    private ObservableCollection<EmpresasTable> lstEmpresas;
    private ObservableCollection<EmpresasEjerciciosTable> ltsEjercicios;
    public ObservableCollection<EmpresasTable> LstEmpresas
    {
        get
        {
            return lstEmpresas;
        }
        set
        {
            lstEmpresas = value; RaisePropertyChanged("LstEmpresas");
        }
    }
    public ObservableCollection<EmpresasEjerciciosTable> LtsEjercicios
    {
        get
        {
            return ltsEjercicios;
        }
        set
        {
            ltsEjercicios = value; RaisePropertyChanged("LtsEjercicios"); 
        }
    }

    //selected company in listbox
    private int selectedCompany;
    public int SelectedCompany
    {
        get
        {
            return selectedCompany;
        }
        set
        {
            selectedCompany = value;
            LtsEjercicios = empresasController.SelectExercicesById(selectedCompany.ToString());
            RaisePropertyChanged("SelectedCompany");
        }
    }

    //main constructor, default values for lists
    public frmEmpresasVM()
    {
        LstEmpresas = empresasController.SelectOnlyNames();
        LtsEjercicios = empresasController.SelectExercicesById("0");
    }

和视图

的XAML
 <ListBox x:Name="companyList" HorizontalAlignment="Left" Height="205" Margin="20,30,0,0" VerticalAlignment="Top" Width="450" ItemsSource="{Binding LstEmpresas, Mode=OneWay}" SelectedValue="{Binding SelectedCompany, Mode=TwoWay}" SelectedItem="{Binding LtsEjercicios, Mode=OneWay}" SelectedIndex="0" DisplayMemberPath="Nombre" SelectedValuePath="Id" IsSynchronizedWithCurrentItem="True" SelectionChanged="companyList_SelectionChanged_1">
            <ListBox.ItemBindingGroup>
                <BindingGroup/>
            </ListBox.ItemBindingGroup>
            <ListBox.DataContext>
                <InnovaCommerceHosteleryViewModels:frmEmpresasVM/>
            </ListBox.DataContext>
        </ListBox>
        <TextBlock x:Name="lblEjercicio" HorizontalAlignment="Left" Height="20" Margin="475,10,0,0" TextWrapping="Wrap" Text="Ejercicios" VerticalAlignment="Top" Width="95"/>
        <ListBox x:Name="excercicesList" HorizontalAlignment="Left" Height="205" Margin="475,30,0,0" VerticalAlignment="Top" Width="110" ItemsSource="{Binding LtsEjercicios, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Ejercicio" SelectedValuePath="Id" SelectedIndex="0" IsSynchronizedWithCurrentItem="True">
            <ListBox.DataContext>
                <InnovaCommerceHosteleryViewModels:frmEmpresasVM/>
            </ListBox.DataContext>

从两个表(empresas y empresas_ejercicios)提供来自MySQL数据库的数据。

我的目标是,当用户选择一个项目在listbox1 (empresas)显示练习在listbox2 (empresas_ejercicios)。

如果有其他的路径来决定这个操作,我会全神贯注!!

辅助列表框未显示数据

不确定这是否是您代码中唯一的问题,但是您通过设置

所做的是什么
<ListBox.DataContext>
    <InnovaCommerceHosteleryViewModels:frmEmpresasVM/>
</ListBox.DataContext>

为每个列表框创建一个单独的ViewModel实例。现在我猜如果你在第一个列表框的ViewModel实例中做了任何更改,这些更改将不会反映在第二个列表框中,因为这个列表框绑定到一个完全不同的ViewModel实例。

相反,尝试将ViewModel全局绑定到整个窗口/页面/用户控件等(取决于您是否正在做WPF, Windows Phone等),并让列表框继承它以确保只涉及一个ViewModel实例:

<Window.DataContext>
    <InnovaCommerceHosteleryViewModels:frmEmpresasVM/>
</Window.DataContext>
编辑:

或者,您也可以实例化一次ViewModel并将其存储为全局资源:

<Window.Resources>
    <InnovaCommerceHosteleryViewModels:frmEmpresasVM x:Key="Viewmodel" />
</Window.Resources>

和在列表框的DataContext只引用这个全局资源:

<ListBox DataContext="{StaticResource Viewmodel}" ... />