Frage

Ich bin sehr neu in WPF und teste einige Dinge, die ich in eine Anwendung einbeziehen möchte, an der ich arbeiten werde. Ich habe eine 2 Zeilen -Listansicht (gebunden an ein Textfeld) mit den Namen Scott Guthrie und Jon Skeet. Ich versuche, "Scott Guthrie" in der Liste auszuwählen, und lasse es das Textfeld füllen. Ich möchte in der Lage sein, den Text und die Registerkarte zu bearbeiten und die Liste zu aktualisieren.

Bearbeiten: Ich habe den Code entfernt, da dies der Frage wirklich nichts hinzufügte.

War es hilfreich?

Lösung

Wow, das ist wirklich kompliziert, was du dort hast.

Dies kann auf sehr einfache Weise erreicht werden. Sie benötigen ein Modell, um den Programmierer darzustellen, ein Ansichtsmodell für eine Liste von Programmierern und eine einfache Bindung, um sich um den Rest zu kümmern.

Das Model:

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

Es ist sehr einfach. Ein Objekt, das einen Programmierer mit einem Namen darstellt. Wir müssen den Namen innerhalb eines Objekts zusammenfassen, da Zeichenfolgen in .NET unveränderlich sind. Wenn Sie versucht haben, sich gegen eine einzelne Zeichenfolge in einer Liste von Zeichenfolgen zu verbinden, würden sich die Änderungen nicht ausbreiten.

Die Sammlung von Programmierern wird in einem ViewModel gehalten. In diesem Fall nenne ich es ViewModel, weil ich keine Fantasie habe. Dieses Ansichtsmodell enthält alles, gegen das die Ansicht bindet. In diesem Fall ist es die Liste der Programmierer.

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

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

Das ViewModel wird als DataContext unserer Ansicht festgelegt. Der DataContext fließt den visuellen Baum hinunter und wir können an jedem Punkt daran binden.

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();
}

Sie können den DataContext auf eine gewünschte Weise festlegen. Ich mache es hier zum Einfachheit halber willen.

In der Benutzeroberfläche bin ich einfach die ListView an die Liste der Programmierer im ViewModel (der DataContext ist, sofern nicht anders angegeben, das Wurzel des Bindungspfads). Ich bin dann das Textfeld an das SelectedItem der Listbox. Sie wählen einen Programmierer aus der Liste aus, der dann zum SelectedItem wird, den ich dann den Namen ändern kann.

<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>

Einfach, sobald Sie den Dreh raus haben.

Andere Tipps

Dies funktioniert (außer dass Sie das Textfeld validieren müssen, da Sie einen beliebigen Text eingeben können. Ein Dropdown könnte eine bessere Wahl sein).

Aussicht:

<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; }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top