如何将字符串属性绑定到ListBox

时间:2018-01-16 14:13:57

标签: c# wpf mvvm listbox

我使用MVVM将List<string>绑定到WPF中的ListBox

目前我有

<ListBox ItemsSource="{Binding FileContents}"></ListBox>

我的ViewModel中的文件内容只是

public List<string> FileContents {get;set;}

FileContents值在ViewModel的构造函数中设置,因此无需担心INotifyProperty

到目前为止一切正常。我可以根据需要看到ListBox中显示的列表。

现在我需要提供一个模板!这是出错的地方

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

这就是出错的地方!我的理解是我只需要执行<TextBox Text = "{Binding}"因为ListBox已绑定到List<string>属性(称为FileContents)

但是,当我运行上面的Visual Studio给我时

  

应用程序处于中断模式

如果我将代码更新为

<TextBox Text = "Some String Value"

然后它工作正常

我不明白我做错了什么。

2 个答案:

答案 0 :(得分:2)

Mode的{​​{1}}设置为Binding

OneWay

<TextBox Text="{Binding Path=., Mode=OneWay}" /> 的{​​{1}}属性的默认绑定模式为Text但是当您绑定到{TextBox时,这不会起作用TwoWay 1}}。

答案 1 :(得分:2)

直接绑定到string只能是一种方式。这意味着您只能像

一样绑定只读
<TextBox Text="{Binding Mode=OneWay}"/>

<TextBox Text="{Binding .}"/>

原因很简单:更改字符串意味着您要删除项目并将其添加到列表中。通过更改TextBox中的字符串,这是不可能的。

解决方案是将内容包装在类

public class FileContent
{
    public string Content { get; set; }
}

并使用List<FileContent>作为模板绑定到<TextBox Text="{Binding Content}"/>列表。