代码之家  ›  专栏  ›  技术社区  ›  MyDaftQuestions

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

  •  1
  • MyDaftQuestions  · 技术社区  · 6 年前

    List<string> 给我的 ListBox

    现在我有

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

    我的ViewModel中的文件内容

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

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

    目前一切正常。我可以在我的 列表框 根据需要。

    现在我需要提供一个模板!这就是问题所在

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

    这就是一切出错的地方!我的理解是我只需要 <TextBox Text = "{Binding}" 因为列表框已绑定到 列表(<);字符串(>); 属性(称为FileContents)

    然而,当我运行上面的Visual Studio时

    应用程序处于中断模式

    如果我将代码更新为

    <TextBox Text = "Some String Value"

    那就好了

    我不明白我做错了什么。

    2 回复  |  直到 6 年前
        1
  •  2
  •   mm8    6 年前

    设置 Mode Binding OneWay :

    <TextBox Text="{Binding Path=., Mode=OneWay}" />
    

    的默认绑定模式 Text a的属性 TextBox TwoWay 但当你绑定到 string 在一个 List<string> .

        2
  •  2
  •   Fruchtzwerg    6 年前

    绑定到 string 直接是唯一可能的方式。这意味着您只能像这样绑定只读

    <TextBox Text="{Binding Mode=OneWay}"/>
    

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

    原因 很简单:更改字符串意味着您正在删除一个项目并将其添加到列表中。这根本不可能通过更改文本框中的字符串来实现。

    解决方案 将内容包装在类中,如

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

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