首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C# wpf将信息从一个列表框显示到另一个列表框

C# wpf将信息从一个列表框显示到另一个列表框
EN

Stack Overflow用户
提问于 2018-06-03 21:07:21
回答 1查看 33关注 0票数 -1

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

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

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

我的NutritionPlan.xaml.cs代码:

代码语言:javascript
复制
    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代码:

代码语言:javascript
复制
    <Grid Background="LightBlue">
    <ListBox HorizontalAlignment="Left" Height="123" Margin="88,220,0,0" VerticalAlignment="Top" Width="162">


    </ListBox>
</Grid>

获取数据的列表框:

代码语言:javascript
复制
<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类:

代码语言:javascript
复制
        private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {            
        _frame.Content = new NutritionPlan(NutritionPlansControlListBx.SelectedItem);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 22:53:53

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

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

NutritionPlan.xaml.cs:

代码语言:javascript
复制
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方法,以便为其自身创建多个每日计划。

NutritionPlanVM.cs:

代码语言:javascript
复制
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);
    }

}

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

代码语言:javascript
复制
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相对应的视图。(例如,MainWindow)。在该视图的构造函数中,您需要DataContext = new RootVM()

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

代码语言:javascript
复制
<ListBox ItemsSource="{Binding ElementName=NutritionPlansControlListBx, Path=SelectedItem.DailyPlans}"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50666755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档