辅助列表框不显示数据

时间:2015-08-02 14:05:04

标签: c# mvvm

我有两个列出了我的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)中显示练习。

如果存在确定此操作的其他路径,我全都是眼睛!!!

提前致谢。

1 个答案:

答案 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}" ... />