我是WPF的新手,并测试了我想在我将要处理的应用程序中包含的一些事情。我有一个2行ListView(绑定到文本框),其中包含Scott Guthrie和Jon Skeet的名称。我正在尝试在ListView中选择“ Scott Guthrie”,并将其填充文本框。我希望能够编辑文本并关闭标签并更新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流下视觉树,我们可以在任何时候绑定到它。

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中的程序员列表绑定(除非另有说明,否则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>

简单,一旦您掌握了它。

其他提示

这起作用(除非您需要验证文本框,因为您可以输入任何文本。.下拉列表可能是一个更好的选择)。

看法:

<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