2015-05-28 98 views
3

我想要做一件非常簡單的事情:我想在ItemsControl中顯示一個ObservableCollection。我也希望用戶能夠編輯ObservableCollection中的字符串。綁定到ObservableCollection <string>

我的視圖模型是非常簡單的:

public class MainViewModel : ViewModelBase 
{ 
    public ObservableCollection<string> Values { get; set; } 

    public MainViewModel() 
    { 
     Values = new ObservableCollection<string> { "foo", "bar" }; 
    } 
} 

在我看來,我定義爲我的ItemsControl顯示每個項目裏面一個文本框一個DataTemplate,這裏沒有問題:

<ItemsControl ItemsSource="{Binding Values}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate DataType="{x:Type sys:String}"> 
        <TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged}" /> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

一切似乎工作順利,我可以在我看來看到我的ObservableCollection的內容。但是,當我編輯文本框中的文本時,我的ObservableCollection未更新,值依然相同。

我發現,使這項工作的唯一解決方法是創建一個類:

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

然後我改變我的ObservableCollection的類型ObservableCollection<StringWrapper>,並在我的DataTemplate中,我綁定的Text屬性我的TextBox值。它有效,但它很醜。

所以我的問題是,有沒有辦法將ObservableCollection綁定到ItemsControl並能夠更新值?

+3

''字符串不執行'INotifyPropertyChanged'。替換爲' – Aron

+0

@Aron:你爲什麼要回答評論? :/ – thomasb

回答

2

除非它直接由列表控件處理,否則我懷疑有任何方法可以做到這一點。 ItemsControl中的模板項只能訪問string實例,而不能訪問實際的集合。並且因爲string是不可變的,所以它是死路一條,沒有辦法追溯對父項的更改。

+0

我不知道'string'在C#中是不可變的。現在我明白爲什麼使用StringBuilder而不是直接修改字符串是一個很好的實踐。我會堅持那種醜陋的方式,謝謝! – Biodd

0

我覺得綁定到自己會做的工作+不要忘記把它兩個。

文本框文本=「{結合}」,模式=雙向

+1

Twoway模式是默認模式。 – alan

0

你的財產值需要實現INotifyPropertyChanged接口,後只值屬性將工作結合。

相關問題