Как связать SelectView SelectedItem с текстовым полетом с помощью режима TwoWay?

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

Вопрос

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

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

Это было полезно?

Решение

Вау, это действительно сложно, что у вас там.

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

Модель:

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 любым способом; Я делаю это здесь ради простоты.

В пользовательском интерфейсе я просто связываю список с списком программистов в ViewModel (DataContext, если не указано иное, является корнем пути связывания). Затем я связываю текстовую поле с SelectedItem of the 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>

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

Другие советы

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

Вид:

<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; }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top