我有两个列出了我的viewmodel属性的列表框,第一个列表框显示了LstEmpresas并且工作正常,当我选择一个项目时,属性SelectedCompany设置正常,一切正常。
在SelectedCompany的我的viewmodel集合中,我调用一个方法而不是瞳孔化一个辅助列表(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>
Al Data从两个表的MySQL数据库中提供(empresas y empresas_ejercicios)。
我的目标是,当用户在listbox1(empresas)中选择一个项目时,在listbox2(empresas_ejercicios)中显示练习。
如果存在确定此操作的其他路径,我全都是眼睛!!!
提前致谢。
答案 0 :(得分:0)
不确定这是您代码中唯一的问题,但是您通过设置
进行的操作<ListBox.DataContext>
<InnovaCommerceHosteleryViewModels:frmEmpresasVM/>
</ListBox.DataContext>
两个列表框的是为每个列表框创建ViewModel的单独实例。现在我想如果你在第一个列表框中进行任何更改&#39; ViewModel实例,这些更改不会反映在第二个列表框中,因为这个更改绑定到完全不同的ViewModel实例。
相反,尝试将ViewModel全局绑定到整个窗口/页面/用户控件/等(取决于您是否;重新执行WPF,Windows Phone等),并让列表框继承它以确保仅涉及一个ViewModel实例:
<Window.DataContext>
<InnovaCommerceHosteleryViewModels:frmEmpresasVM/>
</Window.DataContext>
修改强>
或者,您也可以将ViewModel实例化一次并将其存储为全局资源:
<Window.Resources>
<InnovaCommerceHosteleryViewModels:frmEmpresasVM x:Key="Viewmodel" />
</Window.Resources>
并在列表框中&#39; DataContext
只需参考此全球资源:
<ListBox DataContext="{StaticResource Viewmodel}" ... />