WPF绑定到字符串

3
我有一个名为Movie的类,其中包含Dim _characters = New ObservableCollection(of String)Characters是相关属性,用于获取和设置它们。
我该如何使用绑定使字符显示在listBox中? 到目前为止,我已经尝试了以下内容,但它不起作用,因为我不知道应该放什么替代ToString
<ListBox Name="cList" ItemsSource="{Binding Characters}">

 <ItemsControl >
   <ItemsControl.ItemTemplate >
    <DataTemplate >
     <TextBox Text="{Binding ToString}"/>  
    </DataTemplate> 
   </ItemsControl.ItemTemplate> 
 </ItemsControl>

 </ListBox> 

我希望它们是可编辑的,因此是文本框。
我试图直接将 "Characters" 绑定到 "TextBox" ,但即使这样也不起作用。
编辑: 在代码中我有 parentGrid1.DataContext = me.movies,其中父网格包含电影。

2
尝试像这样做: <TextBox Text="{Binding}"/>,因为itemscontrol中的当前上下文是一个字符串。只需绑定到当前数据上下文({Binding}),无需提供任何进一步的路径。 - Joachim Kerschbaumer
报错信息为“双向绑定需要路径或XPath”。 - heyNow
2
@sitsOnRedChair:这是因为你无法对ObservableCollection<string>执行双向绑定。请查看我的下面的答案:https://dev59.com/vlnUa4cB1Zd3GeqPfO6U#6944272 - Jakob Christensen
5个回答

10

对于那些遇到异常的用户:

... 绑定需要路径或xpath ...

您可以直接使用以下方式绑定对象:

<Label Content="{Binding .}" />

7

将您的TextBox绑定更改为以下内容。我认为它应该可以工作:

<TextBox Text="{Binding}"/>

这会加载项目本身而不是属性或方法的输出。由于该项是一个字符串,因此它应绑定到字符串的值。

啊,我完全忽略了它是一个文本框而不是文本块。对不起。 - CodeWarrior

3

您无法对 ObservableCollection<string> 进行双向绑定。为了使字符串可编辑,您需要创建一个类,该类具有以下形式的字符串 get/set 属性:Foo

public class Foo
{
    string _text;

    public Foo(string text)
    {
        _text = text;
    }
    public string Text 
    {
        get { return _text; }
        set { _text = value; }
    }
}

您的Characters应该是ObservableCollection<Foo>类型,而您的XAML应更改为文本框绑定到Foo.Text

<ListBox ItemsSource="{Binding Characters}" >
    <ListBox.ItemTemplate >
        <DataTemplate >
            <TextBox Text="{Binding Text}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

是的!我刚刚做到了,最终它起作用了。创建了一个名为Character的类,其中包含一个Name属性,将Name绑定到textBox上,现在它可以工作了。 - heyNow
只是出于好奇,为什么它不能与字符串一起使用呢? 它们就像其他任何对象一样。 - heyNow
3
如果直接对字符串或其他对象进行绑定,WPF绑定无法将新对象插入到ObservableCollection中,只能更改已在集合中的对象的属性。如果使用{Binding Text,Mode = OneWay},它会起作用,但是当然你就不能更改字符串。 - Jakob Christensen

3

只需删除代码中的ToString部分。

目前您告诉程序您想要绑定到一个名为ToString的对象。


2

我理解 Characters 是一个公共属性。请进行调试,确保 get 方法正在为 Characters 调用。如果您将页面/窗口的数据上下文设置为 Movies,则需要将 ListBox 上的 ItemsSource 设置为 {Binding Path=Characters}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接