Wpf datacontext de liaison à l'aide de MVVM entre viewmodel et vue

J'ai juste commencé à apprendre le MVVM et voici ce qui semble être question de base mais j'ai passé toute la journée à essayer de le comprendre.

J'ai une solution qui contient 3 projets pour un Modèle, un pour le ViewModel et un pour la Vue. Le Modèle contient une classe qui possède 2 propriétés de Texte et CheckStatus.

Le ViewModel a une liste appelée listOfItems qui a trois éléments, chaque élément a ces 2 propriétés dans le Modèle.

Le point de Vue a une listView à l'intérieur il ya une Case à cocher. Quelle est la bonne façon de lier la Case contenu du Texte de la propriété?

Ici est le modèle

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace TheModel
{
public class CheckBoxListModel : INotifyPropertyChanged
{
    private string text;
    public string Text
    {
        get { return text; }
        set
        {
            text = value;
            RaiseChanged("Text");
        }
    }

    private bool checkStatus;
    public bool CheckStatus
    {
        get { return checkStatus; }
        set
        {
            checkStatus = value;
            RaiseChanged("CheckStatus");
        }
    }

    private void RaiseChanged(string propName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
   }
}

Ici est le modèle de vue

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using TheModel;

namespace TheViewModel
{
public class TheViewModel
{
    public List<CheckBoxListModel> ListOfItems { get; set; }

    public TheViewModelClass()
    {
        ListOfItems = new List<CheckBoxListModel>
        {
        new CheckBoxListModel
        {
            CheckStatus = false,
            Text = "Item 1",
        },
        new CheckBoxListModel
        {
            CheckStatus = false,
            Text = "Item 2",
        },
        new CheckBoxListModel
        {
            CheckStatus = false,
            Text = "Item 3",
        }
    };
    }

    public static implicit operator List<object>(TheViewModelClass v)
    {
        throw new NotImplementedException();
    }
   }
}

et voici la Vue XAML

 <UserControl
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:ctrl="clr-namespace:TheView.Managers" xmlns:TheViewModel="clr-
 namespace:TheViewModel;assembly=TheViewModel" 
 x:Class="TheView.Styles.ListViewDatabaseStyle">

<UserControl.DataContext>
    <TheViewModel:TheViewModelClass/>
</UserControl.DataContext>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="100"/>
    </Grid.RowDefinitions>
    <Button Content="Continue" Style="{StaticResource ButtonStyle}" 
          Margin="1104,27,40,40"/>
    <ListView x:Name="listView1" SelectionMode="Multiple" 
              Style="{StaticResource ListViewStyle}" Margin="10,55,10,10"
              ctrl:ListViewLayoutManager.Enabled="true" ItemsSource="
          {Binding TheViewModelClass}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Competency Items" 
                  ctrl:ProportionalColumn.Width="1100"/>
            </GridView>
        </ListView.View>
        <ListView.ItemContainerStyle >
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="IsSelected" Value="{Binding 
                             CheckedStatus}"/>
                <Setter Property="HorizontalContentAlignment" 
                              Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <CheckBox  
                     Click="CheckBox_Click"
                     Content="{Binding Path=TheViewModelClass.Text}"
                     IsChecked="{Binding 
                     Path=TheViewModelClass.CheckedStatus}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
</UserControl>

Voici la Vue derrière le code, je sais que je ne devrais pas avoir quelque chose ici, mais où la partie de go?

using System.Windows;
using System.Windows.Controls;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System;
using System.Text;
using TheViewModel;

namespace TheView.Styles
{
public partial class ListViewDatabaseStyle : UserControl
{
    public ListViewDatabaseStyle()
    {
        InitializeComponent();
    }

    public List<string> selectedNames = new List<string>();
    private void CheckBox_Click(object sender, RoutedEventArgs e)
    {
        var ChkBox = sender as CheckBox;
        var item = ChkBox.Content;
        bool isChecked = ChkBox.IsChecked.HasValue ? ChkBox.IsChecked.Value 
         : false;
        if (isChecked)
            selectedNames.Add(item.ToString());
        else
            selectedNames.Remove(item.ToString());
    }
  }
 }
La bonne façon est de vérifier que le DataContext est correctement réglé pour votre Modèle ou ViewModel, et l'utilisation d'une Liaison à tirer la valeur de l'objet de données dans l'INTERFACE utilisateur. Avez-vous rencontré le DataContext encore dans votre apprentissage? Si pas, je l'habitude d'envoyer de nouveaux codeurs de ce post : qu'est-Ce que DataContext?
Je n'ai pas trouvé la bonne façon d'utiliser le DataContext de sorte que cela fonctionne. J'ai essayé plusieurs fois et je l'ai vu mis en œuvre dans plusieurs sens, mais aucun n'a fonctionné pour moi
partie supprimée du derrière le code pour le datacontext parce que c'était le mal par. et désolé @Peter votre solution n'a pas fonctionné
Si j'étais vous, je voudrais changer de liste pour ObservableCollection. public ObservableCollection<CheckBoxListModel> ListOfItems { get; set; } Et faites-moi confiance. Vous n'avez pas à ajouter chaque liaison de votre viewmodel. Dans votre Listview ItemSource={Binding ListOfItems} <Case Content="{Binding Texte}" IsChecked="{Binding CheckedStatus}" />
En passant, vous pouvez trouver de l'aide dans le WPF salle de chat. Nous sommes là, la plupart des jours de la semaine pendant les heures de travail.

OriginalL'auteur | 2017-04-26