Comment puis-je lier un Listview SelectedItem à une zone de texte en utilisant le mode TwoWay?

StackOverflow https://stackoverflow.com/questions/4529242

Question

Je suis très nouveau pour WPF et tester certaines choses que je voudrais inclure dans une application que je travaillerai sur. J'ai 2 rangs ListView (lié à une zone de texte) avec les noms Scott Guthrie et Jon Skeet en elle. Je suis en train de sélectionner « Scott Guthrie » dans le ListView et ai remplir la zone de texte. Je veux être en mesure de modifier le texte et l'onglet OFF et ListView mis à jour.

Modifier :. J'ai supprimé le code depuis que n'a pas vraiment ajouter quoi que ce soit à la question

Était-ce utile?

La solution

Wow, c'est vraiment compliqué ce que vous avez là.

Ceci peut être accompli d'une manière très simple. Vous avez besoin d'un modèle pour représenter le programmeur, un modèle en vue de tenir une liste des programmeurs, et liaison simple à prendre en charge le reste.

Le modèle:

public sealed class Programmer
{
    public string Name { get; set; }
}

Il est très simple. Un objet représentant un programmateur avec un nom. Nous devons encapsulons le nom dans un objet parce que les chaînes sont immuables dans .NET. Si vous avez essayé de liaison contre une seule chaîne dans une liste de chaînes, les changements ne se propager.

La collection de programmeurs est conservé dans un ViewModel. Dans ce cas, je l'appelle ViewModel, parce que je n'ai pas d'imagination. Ce modèle de vue contient tout ce que la vue se fixe contre. Dans ce cas, sa la liste des programmeurs.

public sealed class ViewModel
{
    public ObservableCollection<Programmer> Programmers { get; private set; }

    public ViewModel()
    {
        Programmers = new ObservableCollection<Programmer>();
    }
}

Le ViewModel est défini comme DataContext de notre point de vue. Le DataContext coule vers le bas l'arbre visuel, et nous pouvons lier contre elle à tout moment.

public MainWindow()
{
    var vm = new ViewModel();
    vm.Programmers.Add(new Programmer { Name = "Jon Skeet" });
    vm.Programmers.Add(new Programmer { Name = "Scott Guthrie" });
    DataContext = vm;
    InitializeComponent();
}

Vous pouvez définir les DataContext de quelque manière que vous voulez; Je fais ici pour des raisons de simplicité.

Dans l'interface utilisateur, je simplement lier la ListView contre la liste des programmeurs dans le ViewModel (DataContext, sauf indication contraire, est la racine du chemin de liaison). Je puis lier la zone de texte contre le SelectedItem du ListBox. Vous sélectionnez un programmeur dans la liste, qui devient alors le SelectedItem, que je peux alors changer le nom de.

<Window
    x:Class="Programmers.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:t="clr-namespace:Programmers"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <ListBox
            x:Name="list"
            ItemsSource="{Binding Programmers}"
            DisplayMemberPath="Name" />
        <TextBox
            Grid.Column="1"
            VerticalAlignment="Top"
            Text="{Binding SelectedItem.Name, ElementName=list}" />
    </Grid>
</Window>

Simple, une fois que vous obtenez le coup de lui.

Autres conseils

Cela fonctionne (sauf que vous devez valider la zone de texte puisque vous pouvez saisir un texte .. un menu déroulant est peut-être un meilleur choix).

Voir:

<TabItem x:Name="RightTabPage" Header="RightModel"  DataContext="{Binding Right}">
                    <StackPanel>
                        <TextBox Text="{Binding SelectedGuru}"/>
                        <ListView SelectedItem="{Binding SelectedGuru}" ItemsSource="{Binding Gurus}"/>
                    </StackPanel>
                </TabItem>

ViewModel:

public class RightViewModel
    {
        public RightViewModel()
        {
            Gurus = new[] {"Scott Guthrie", "Jon Skeet"};
            SelectedGuru = Gurus.First();
        }

        public string SelectedGuru { get; set; }
        public IEnumerable<string> Gurus{ get; set; }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top