2011-04-26 58 views
2

編輯:基本問題是將List綁定到ListBox(或任何其他控件)。所以我正在編輯這個問題。如何在綁定到列表時使ListBox可編輯<string>?

我將一個字符串列表綁定到一個ListBox,如下所示。但是,當我更改文本框的內容時,它不會更改源列表中的字符串。爲什麼?

public partial class MainWindow : Window 
{ 
    List<string> _nameList = null; 

    public List<string> NameList 
    { 
     get 
     { 
      if (_nameList == null) 
      { 
       _nameList = new List<string>(); 
      } 
      return _nameList; 
     } 
     set 
     { 
      _nameList = value; 
     } 
    } 
    public MainWindow() 
    { 
     NameList.Add("test1"); 
     NameList.Add("test2"); 
     InitializeComponent(); 
    } 

而XAML

<ListBox Grid.Row="0" Grid.Column="0" DataContext="{Binding ElementName=main}" ItemsSource="{Binding NameList}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding .,Mode=OneWayToSource , UpdateSourceTrigger=PropertyChanged}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

回答

11

每個ListBoxItemDataContext是字符串本身,所以你結合的路徑爲空(.)。 TwoWayOneWayToSource綁定需要路徑,因爲您不能只替換當前的DataContext。因此,你需要用你的字符串中暴露的字符串作爲屬性的對象:

public class StringItem 
{ 
    public string Value { get; set; } 
} 

揭露字符串作爲StringItem列表:

public partial class MainWindow : Window 
{ 
    List<StringItem> _nameList = null; 

    public List<StringItem> NameList 
    { 
     get 
     { 
      if (_nameList == null) 
      { 
       _nameList = new List<StringItem>(); 
      } 
      return _nameList; 
     } 
     set 
     { 
      _nameList = value; 
     } 
    } 
    public MainWindow() 
    { 
     NameList.Add(new StringItem { Value = "test1" }); 
     NameList.Add(new StringItem { Value = "test2" }); 
     InitializeComponent(); 
    } 

並綁定到Value屬性:

<ListBox Grid.Row="0" Grid.Column="0" DataContext="{Binding ElementName=main}" ItemsSource="{Binding NameList}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

請注意,StringItem也需要實現INotifyPropertyChanged,以便綁定自動更新。您還應該將該列表公開爲ObservableCollection<T>而不是List<T>

+0

謝謝托馬斯,很好的回答。僅供參考,代碼「public string class StringItem {}」讓我困惑,可能是一個錯誤。 – Jimmy 2011-04-27 16:16:22

+0

@Jimmy,是的,這是一個錯誤...我打字時一定被分心了;) – 2011-04-27 16:47:35

0

您可以創建一個ItemsControl和文本框一個DataGridTemplateColumn.CellEditingTemplate編輯您的項目

+0

你可以這樣編輯用戶界面,但編輯將不會反映在列表對象 – Jimmy 2011-04-27 12:38:06

+0

請檢查編輯的問題。即使我可以編輯UI中的文本框,它也不會在源代碼中反映出來 – Jimmy 2011-04-27 15:33:36

1

可能是它helsp?

<ListBox Name="lsbList"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Path=Value}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

您可以像這樣編輯UI,但編輯將不會反映在列表對象中 – Jimmy 2011-04-27 12:37:52

+0

您是什麼意思? NameColumnField - 您的對象列表。例如,其中一個屬性具有名稱Value。該值綁定到DataTemplate中的TextBox。如果你在文本框中改變它,它將不會在有界對象中改變? – IVerzin 2011-04-27 14:04:44

+0

此外,請檢查編輯的問題,我回到實際問題。 – Jimmy 2011-04-27 15:27:40

0

如果我沒有誤解您的問題,那麼實現起來相當容易。看:

<ComboBox Text="My Comment 5 with addition." IsEditable="True" Height="25" Width="200"> 
     <ComboBoxItem>My comment1</ComboBoxItem> 
     <ComboBoxItem>My comment2</ComboBoxItem> 
</ComboBox> 
相關問題