C # wpf отображение информации из одного списка в другой - PullRequest
0 голосов
/ 03 июня 2018

У меня есть список с данными внутри (планы питания) и функция mousedoubleclick, которая открывает данные об определенной информации о плане питания (ежедневные планы питания) на новой странице.Класс 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);
    }

1 Ответ

0 голосов
/ 03 июня 2018

Во-первых, ваше мнение не должно знать о модели.поэтому я переместил модель для просмотра модели.

Также вы должны быть осторожны с контекстом данных, так как каждое представление имеет только одно.поэтому я изменил его тип на тип модели представления контейнера, который содержит ежедневные планы.На этом этапе ваше представление 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]);
    }

}

Теперь дляПри связывании root, должно быть представление, соответствующее этому RootVM.(например, MainWindow).в конструкторе этого представления вам нужно DataContext = new RootVM()

Теперь, когда все на месте, вы можете привязать к текущему выбранному элементу первого списка и использовать этот элемент для извлечения информации о модели представления:

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