辅助列表框未显示数据
本文关键字:显示 数据 列表 | 更新日期: 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}" ... />