首页 > 解决方案 > C# wpf 将信息从一个列表框显示到另一个列表框

问题描述

我有一个列表框,里面有数据(营养计划)和一个鼠标双击功能,可以在新页面中打开有关某些营养计划信息(每日营养计划)的数据。GetDailyNutrition 类从第一个列表框中获取 Id。

如果我单击列表框上的“营养计划 A”,它应该在不同的列表框中(在 NutritionPlan.xaml 视图中)显示每日营养。

问题是,我无法在列表框中显示每日营养。

我的NutritionPlan.xaml.cs代码:

    public partial class NutritionPlan : Page
{
    private DailyNutritionPlanVM _dailyNutritionplanvm;

    public Models.NutritionPlan _NPlan;

    public NutritionPlan(Object NPlan)
    {
        _NPlan = NPlan as Models.NutritionPlan;
        InitializeComponent();
    }

    public void getDailyNutrition()
    {
        _dailyNutritionplanvm = new DailyNutritionPlanVM();
        _dailyNutritionplanvm.LoadData(_NPlan.NutritionPlanId);
        DataContext = _dailyNutritionplanvm;
    }
}

我的NutritionPlan.Xaml代码:

    <Grid Background="LightBlue">
    <ListBox HorizontalAlignment="Left" Height="123" Margin="88,220,0,0" VerticalAlignment="Top" Width="162">


    </ListBox>
</Grid>

获取数据的列表框:

<ListBox x:Name="NutritionPlansControlListBx" Margin="10,5" Height="282" ItemsSource="{Binding NutritionPlans}" 
                 MouseDoubleClick="ListBox_MouseDoubleClick">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding NutritionPlanName}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>

        </ListBox>

MouseDoubleClick 类:

        private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {            
        _frame.Content = new NutritionPlan(NutritionPlansControlListBx.SelectedItem);
    }

标签: c#wpfdata-bindinglistbox

解决方案


首先,你的视图不应该知道模型。所以我将模型移动到视图模型。

此外,您必须小心数据上下文,因为每个视图只有一个。所以我将其类型更改为包含每日计划的容器视图模型类型。此时,您的 NutritionPlan 视图从 NutritionPlanVM 的一个对象开始。

营养计划.xaml.cs:

public partial class NutritionPlan : Page
{
    public NutritionPlanVM ViewModel { get { return DataContext as NutritionPlanVM; } set { DataContext = value; } }

    public NutritionPlan(Object NPlan)
    {
        InitializeComponent();
        //ViewModel = new NutritionPlanVM(NPlan);
        //or can be ViewModel = a VM selected from RootVM
    }
}

此视图模型需要显式调用其 LoadData 方法,以便为自己创建多个每日计划。

营养计划VM.cs:

public class NutritionPlanVM : DependencyObject
{
    Models.NutritionPlan _NPlan;

    private ObservableCollection<DailyNutritionPlanVM> _dailyPlans;
    public ObservableCollection<DailyNutritionPlanVM> DailyPlans { get { return _dailyPlans; } }

    public void LoadData(Models.NutritionPlan _NPlan)
    {
        var dnpVM = new DailyNutritionPlanVM(_NPlan.NutritionPlanId);
        _dailyPlans.Add(dnpVM);
    }

}

您需要另一个包含所有营养计划的可观察集合的视图模型。

public class RootVM : DependencyObject
{
    private ObservableCollection<NutritionPlanVM> _nutritionPlans;
    public ObservableCollection<NutritionPlanVM> NutritionPlans { get { return _nutritionPlans; } }

    //vm data populated in constructor
    public RootVM()
    {
        _nutritionPlans.Add([add all nutrition plans]);
    }

}

现在对于绑定根,应该有一个对应于这个 RootVM 的视图。(例如,主窗口)。在你需要的那个视图的构造函数中DataContext = new RootVM()

现在一切就绪,您可以绑定到第一个列表框的当前选定项,并使用该项提取视图模型信息:

<ListBox ItemsSource="{Binding ElementName=NutritionPlansControlListBx, Path=SelectedItem.DailyPlans}"/>

推荐阅读