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

Posted

技术标签:

【中文标题】如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?【英文标题】:How do I bind a Listview SelectedItem to a Textbox using the TwoWay mode? 【发布时间】:2011-05-30 13:52:22 【问题描述】:

我对 WPF 非常陌生,我正在测试一些我想包含在我将要处理的应用程序中的东西。我有一个 2 行 ListView(绑定到一个文本框),其中包含 Scott Guthrie 和 Jon Skeet 的名字。我正在尝试在 ListView 中选择“Scott Guthrie”并让它填充 TextBox。我希望能够编辑文本并关闭标签并更新 ListView。

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

【问题讨论】:

信息太多了 :) 下次再说 请分享您的代码。 @尼克U。 【参考方案1】:

哇,你得到的东西真的很复杂。

这可以通过非常简单的方式完成。你需要一个模型来代表程序员,一个视图模型来保存程序员列表,以及简单的绑定来处理剩下的事情。

型号:

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;为了简单起见,我在这里这样做。

在 UI 中,我只是将 ListView 与 ViewModel 中的 Programmers 列表绑定(DataContext,除非另有说明,是绑定路径的根)。然后我将 TextBox 与 ListBox 的 SelectedItem 绑定。您从列表中选择一个 Programmer,然后它将成为 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 Joooooeeeeeeeeeeeeeeeeee! +1。谢谢大佬,真的帮到我了!我使用list.ItemSource = vm 而不是DataContext = vm。当我有多个列表时,我想我也有,但不确定,因为我是 WPF 新手。 小提示,因为 OP 询问了ListView 而这个解决方案适用于ListBoxListView is a subclass of ListBox,所以这个代码适用于任何一个。【参考方案2】:

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

查看:

<TabItem x:Name="RightTabPage" Header="RightModel"  DataContext="Binding Right">
                    <StackPanel>
                        <TextBox Text="Binding SelectedGuru"/>
                        <ListView SelectedItem="Binding SelectedGuru" ItemsSource="Binding Gurus"/>
                    </StackPanel>
                </TabItem>

视图模型:

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; 
    

【讨论】:

以上是关于如何使用 TwoWay 模式将 Listview SelectedItem 绑定到文本框?的主要内容,如果未能解决你的问题,请参考以下文章

wpf model 默认啥模式? twoWay?

TwoWay 模式的绑定和 x:Bind 问题

twoway 系列命令绘制地图

将阴影添加到 ListView(图标模式)?

InvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作

InvalidOperationException - TwoWay 或 OneWayToSource 绑定无法在只读属性上工作