Wpf 如何使用双向模式将Listview SelectedItem绑定到文本框?

Wpf 如何使用双向模式将Listview SelectedItem绑定到文本框?,wpf,listview,2-way-object-databinding,Wpf,Listview,2 Way Object Databinding,我是WPF的新手,正在测试一些我想包含在我将要开发的应用程序中的东西。我有一个两行列表视图(绑定到一个文本框),其中有Scott Guthrie和Jon Skeet的名字。我试图在ListView中选择“Scott Guthrie”,并让它填充文本框。我希望能够编辑文本和标签关闭,并有更新的ListView 编辑:我删除了代码,因为这并没有给问题添加任何内容。这是有效的(除了您需要验证文本框,因为您可以输入任何文本。.下拉列表可能是更好的选择) 视图: 视图模型: public class

我是WPF的新手,正在测试一些我想包含在我将要开发的应用程序中的东西。我有一个两行列表视图(绑定到一个文本框),其中有Scott Guthrie和Jon Skeet的名字。我试图在ListView中选择“Scott Guthrie”,并让它填充文本框。我希望能够编辑文本和标签关闭,并有更新的ListView

编辑:我删除了代码,因为这并没有给问题添加任何内容。

这是有效的(除了您需要验证文本框,因为您可以输入任何文本。.下拉列表可能是更好的选择)

视图:


视图模型:

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; }
    }
公共类RightViewModel
{
public RightViewModel()
{
古鲁=新[]{“斯科特·古思里”、“乔恩·斯凯特”};
SelectedGuru=Gurus.First();
}
公共字符串SelectedGuru{get;set;}
公共IEnumerable Gurus{get;set;}
}

哇,这真是太复杂了

这可以用一种非常简单的方法来实现。您需要一个模型来表示程序员,一个视图模型来保存程序员列表,以及一个简单的绑定来处理其余部分

模型:

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>();
    }
}
您可以按任何方式设置DataContext;我在这里是为了简单起见

在UI中,我只是将ListView与ViewModel中的程序员列表绑定(除非另有说明,否则DataContext是绑定路径的根)。然后将文本框与列表框的SelectedItem绑定。您可以从列表中选择一个程序员,然后成为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>


很简单,一旦你掌握了窍门。

信息太多了:)只是为了下一次是的,似乎知道是成功的一半。谢谢成功了@nick GI Joooeeee+1.谢谢你,伙计,这真的帮了我的忙!不过,我使用了
list.ItemSource=vm
而不是
DataContext=vm
。当我有多个列表时,我想我也有,但不确定,因为我是WPF的新手。请注意,因为OP询问了
ListView
,而此解决方案是针对
ListBox
:,所以此代码对这两种情况都适用。
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();
}
<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>