2011-12-29 63 views
3

我窗口的XAML:雙向結合不起作用

<ListView Grid.Row="0" Name="files"> 
     <ListView.Resources> 
      <DataTemplate x:Key="CheckboxTemplate"> 
       <CheckBox IsChecked="{Binding Save, Mode=TwoWay}" /> 
      </DataTemplate> 
     </ListView.Resources> 
     <ListView.View> 
      <GridView AllowsColumnReorder="False"> 
       <GridViewColumn Header=" " Width="30" CellTemplate="{StaticResource CheckboxTemplate}" /> 
       <GridViewColumn Header="Datei" DisplayMemberBinding="{Binding File}"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 

我窗口的構造函數:

IEnumerable<SaveItem> sil = sdl.Select(d => new SaveItem() { Save = true, Document = d }); 
files.ItemsSource = sil; 

和數據結構我想顯示:

public class SaveItem : INotifyPropertyChanged 
{ 
    private bool save; 
    public bool Save 
    { 
     get { return this.save; } 

     set 
     { 
      if (value != this.save) 
      { 
       this.save = value; 
       NotifyPropertyChanged("Save"); 
      } 
     } 
    } 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
    public StandardDocument Document { get; set; } 
    public string File { get { return Document.Editor.File; } } 

    #region INotifyPropertyChanged Member 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

我打電話給窗戶。窗口出現。我取消選中listview項目的複選框。我點擊一個按鈕。在它的事件處理程序中,我讀出了listview的itemssource,並且...未檢查項的Save-Property(源代碼)仍然是真的!

我的錯誤在哪裏?爲什麼我的資源沒有得到更新,如果我檢查/取消選中複選框?

回答

2

您尚未設置數據上下文。如果你全部在同一個類中 - 在窗口的構造函數中放置這樣的東西。

DataContext = this; 
+0

PS評價 - 您可以使用名爲「Snoop」的程序附加到正在運行的程序並檢查數據綁定錯誤。如果你這樣做 - 你會看到窗口上的數據上下文,所有的子元素可能都是空的。 – tsells 2011-12-29 02:23:34

0

我認爲你需要將DataContext設置爲後面的代碼,然後爲了清晰起見綁定到路徑。

XAML設置窗口的DataContext

DataContext="{Binding RelativeSource={RelativeSource Self}}" 
+0

在tsells的答案背後的代碼是正確的。對於我來說,如果你要在XAML中設置路徑,應該在XAML中設置DataContext。 – Paparazzi 2011-12-29 02:32:40

0

嘗試變換的IEnumerable列出.. 它不建議使用的IEnumerable作爲項目源特別是當項目源使用LINQ

List<SaveItem> sil = sdl.Select(d => new SaveItem() { Save = true, Document = d }).ToList<SaveItem>(); 
files.ItemsSource = sil;