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

Nic*_*k U 4 wpf listview 2-way-object-databinding

我是WPF的新手,并测试了一些我想要包含在我将要处理的应用程序中的内容.我有一个2行ListView(绑定到文本框),其中包含Scott Guthrie和Jon Skeet的名字.我试图在ListView中选择"Scott Guthrie"并让它填充TextBox.我希望能够编辑文本和选项卡并更新ListView.

编辑:我删除了代码,因为它确实没有添加任何问题.

小智 32

哇,你到那里真的很复杂.

这可以通过非常简单的方式完成.您需要一个模型来表示程序员,一个视图模型来保存程序员列表,以及简单的绑定来处理其余的事情.

该模型:

public sealed class Programmer
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它非常简单.表示具有名称的程序员的对象.我们必须在名称中封装名称,因为字符串在.NET中是不可变的.如果您尝试绑定字符串列表中的单个字符串,则更改不会传播.

程序员集合保存在ViewModel中.在这种情况下,我称之为ViewModel,因为我没有想象力.此视图模型包含视图绑定的所有内容.在这种情况下,它是程序员的列表.

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

    public ViewModel()
    {
        Programmers = new ObservableCollection<Programmer>();
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

您可以以任何方式设置DataContext; 我是为了简单起见而在这里做的.

在UI中,我只是将ListView绑定到ViewModel中的程序员列表(DataContext,除非另有说明,否则是绑定路径的根).然后我将TextBox绑定到ListBox的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>
Run Code Online (Sandbox Code Playgroud)

简单,一旦掌握了它.

  • 是的,似乎知道是成功的一半.谢谢!那就做到了! (2认同)
  • @nick GI Joooooeeeeeeeeeeeeeeeeeee! (2认同)

Gis*_*shu 5

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

视图:

<TabItem x:Name="RightTabPage" Header="RightModel"  DataContext="{Binding Right}">
                    <StackPanel>
                        <TextBox Text="{Binding SelectedGuru}"/>
                        <ListView SelectedItem="{Binding SelectedGuru}" ItemsSource="{Binding Gurus}"/>
                    </StackPanel>
                </TabItem>
Run Code Online (Sandbox Code Playgroud)

视图模型:

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; }
    }
Run Code Online (Sandbox Code Playgroud)