c# - 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);
}
解决方案
首先,你的视图不应该知道模型。所以我将模型移动到视图模型。
此外,您必须小心数据上下文,因为每个视图只有一个。所以我将其类型更改为包含每日计划的容器视图模型类型。此时,您的 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}"/>
推荐阅读
- javascript - jQuery Textillate 选项未创建预期结果
- azure - 如何使用 filebeat azure 模块将日志重定向到不同的 kibana 空间?
- html - 如何对齐同一行中的两个标题?
- google-analytics-api - 随机“用户对此配置文件没有足够的权限。” 来自 Google Analytics API v3 的错误
- mysql - 奇怪的 MySQL JOIN,我想包含匹配项并且没有来自连接的匹配项
- cmake - 如何将 PUBLIC_HEADER 设置为文件列表?
- python - 返回对 PyO3 中成员字段的引用
- python - 重叠时如何获得不同线性化线图的累积和
- office-js - 为日历会议创建 Outlook 插件
- python - Discord.py - 消息,只有一个用户可以在服务器中看到