我有一个列表框,其中包含数据(营养计划)和一个moused双击功能,可在新页面中打开有关某些营养计划信息(每日营养计划)的数据。 GetDailyNutrition类从第一个列表框中获取Id。
如果我点击列表框中的“营养计划A”,它应该在不同的列表框中显示每日营养(在marketingPlan.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);
}
答案 0 :(得分:0)
首先,您的观点不应该知道模型。所以我把模型移到了查看模型。
此外,您必须小心数据上下文,因为每个视图只有一个。所以我将其类型更改为包含每日计划的容器视图模型类型。此时,您的NutritionPlan视图从NutritionPlanVM的一个对象开始。
NutritionPlan.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方法,以便为自己创建多个每日计划。
NutritionPlanVM.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对应的视图。 (例如,MainWindow)。在该视图的构造函数中,您需要DataContext = new RootVM()
现在一切就绪,您可以绑定到第一个列表框中当前选定的项目,并使用该项目提取视图模型信息:
<ListBox ItemsSource="{Binding ElementName=NutritionPlansControlListBx, Path=SelectedItem.DailyPlans}"/>