Как связать Listview SelectedItem с текстовым полем, используя режим TwoWay? - PullRequest
4 голосов
/ 25 декабря 2010

Я очень новичок в WPF и тестирую некоторые вещи, которые я хотел бы включить в приложение, над которым я буду работать.У меня есть двухстрочный ListView (привязанный к текстовому полю) с именами Скотта Гатри и Джона Скита.Я пытаюсь выбрать «Скотт Гатри» в ListView и заполнить TextBox.Я хочу иметь возможность редактировать текст и вкладку и обновлять ListView.

Редактировать : я удалил код, так как он действительно ничего не добавил к вопросу.

Ответы [ 2 ]

31 голосов
/ 25 декабря 2010

Ух ты, это действительно сложно, что у тебя там.

Это можно сделать очень простым способом.Вам нужна модель для представления программиста, модель представления для хранения списка программистов и простая привязка для заботы об остальном.

Модель:

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

Это очень просто,Объект, представляющий программиста с именем.Мы должны инкапсулировать имя в объект, потому что строки неизменны в .NET.Если вы попытаетесь связать одну строку в списке строк, изменения не будут распространяться.

Коллекция программистов хранится во ViewModel.В этом случае я называю это ViewModel, потому что у меня нет воображения.Эта модель представления содержит все, с чем связывается представление.В данном случае это список программистов.

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

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

ViewModel устанавливается как DataContext нашего представления.DataContext стекает по визуальному дереву, и мы можем связываться с ним в любой точке.

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

Вы можете установить DataContext любым способом;Я делаю это здесь для простоты.

В пользовательском интерфейсе я просто связываю ListView со списком программистов в ViewModel (DataContext, если не указано иное, является корнем пути привязки).Затем я связываю TextBox с SelectedItem ListBox.Вы выбираете Программиста из списка, который затем становится SelectedItem, который я затем могу изменить Имя.

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

Простой, как только вы освоите его.

5 голосов
/ 25 декабря 2010

Это работает (за исключением того, что вам нужно проверить текстовое поле, так как вы можете ввести любой текст .. выпадающий может быть лучшим выбором).

Вид:

<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; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...