2012-11-23 45 views
2

我最近發現了約BindingGroups,它看起來相當不錯。 但我無法讓它在我的ListView中工作,其中充滿了DataTemplates中表示的數據。ListView中的BindingGroup與DataTemplate

(事先我只想說:對不起,所有的代碼,它只是給你一個更好的瞭解)

所以在XAML它看起來是這樣的:

<StackPanel Name="stpData"> 
    <StackPanel.BindingGroup> 
     <BindingGroup /> 
    </StackPanel.BindingGroup> 

    <!-- This works nice! --> 
    <TextBox Text="{Binding Path=name}" /> 
    <CheckBox IsChecked="{Binding Path=enable}" /> 

    <!-- This doesn't work so nice... --> 
    <ListView Name="lvBools" ItemsSource="{Binding Path=myList}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <CheckBox IsChecked="{Binding bools}" /> 
          </StackPanel> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</StackPanel> 

和代碼-behind:

public MainWindow() 
{ 
    InitializeComponent(); 

    TestData Data = new TestData() 
    { 
     name = "Test", 
     enable = true, 
     myList = new List<TestData.myItem> 
     { 
      new TestData.myItem(true), 
      new TestData.myItem(true), 
      new TestData.myItem(false) 
     }, 
    }; 

    stpData.DataContext = Data; 
    stpData.BindingGroup.BeginEdit(); 
} 

private void btnSave_Click(object sender, RoutedEventArgs e) 
{ 
    stpData.BindingGroup.CommitEdit(); 
    stpData.BindingGroup.BeginEdit(); 
} 

private void btnCancel_Click(object sender, RoutedEventArgs e) 
{ 
    stpData.BindingGroup.CancelEdit(); 
    stpData.BindingGroup.BeginEdit(); 
} 

public class TestData 
{ 
    public class myItem 
    { 
     public myItem(bool b) 
     { 
      this.bools = b; 
     } 
     public bool bools { get; set; } 
    } 

    public string name { get; set; } 
    public bool enable { get; set; } 
    public List<myItem> myList { get; set; } 
} 

那麼happends它,當我改名字,或按啓用複選框,這些更改將不會提交,直到我按下SaveButton(btnSave_Click)(未包含在產品在XAML) 或者如果我按取消按鈕更改是「恢復」。 但是,如果我點擊ListView中的某個複選框,這些更改將立即提交。

我自己的猜測:ListView(或者甚至在DataTemplate中的StackPanel)會阻止BindingGroup繼承鏈。但在那種情況下,我怎麼能包括他們呢?

編輯 我也曾嘗試新BindingGroup添加到的DataTemplate:

<DataTemplate> 
    <StackPanel x:Name="SPpan"> 
     <StackPanel.BindingGroup> 
      <BindingGroup Name="BGStackPanel" /> 
     </StackPanel.BindingGroup> 
     <CheckBox IsChecked="{Binding Path=bools}" /> 
    </StackPanel> 
</DataTemplate> 

現在,當我編輯bools(在我ListView點擊它們),源沒有更新,這很好,但現在我無法保存數據(提交)。 我既不能從代碼隱藏中訪問SPpan也不能訪問BGStackPanel。 不過,我已經試過如下:

var tmp = (lvBools.View as GridView).Columns[0]; 
(tmp.CellTemplate.LoadContent() as StackPanel).BindingGroup.BeginEdit(); 

而且這個沒有成功...

編輯 好了,所以編輯II ...所以我想,之所以爲什麼沒有按源更新是因爲我在模板上運行Begin/CommitEdit,而不是從模板創建的實際對象。那麼是否有人知道如何達到這些目標?

回答

1

好吧,多虧了E.L Dunn先生,我解決了這個問題!

所以我的第一個編輯我認爲,我可能會在DataTemplate添加BindingGroupStackPanel,那是一種在正確的方向...

所有需要做的是將一個BindingGroupName添加到DataTemplate的CheckBox。

<StackPanel Name="stpData"> 
    <StackPanel.BindingGroup> 
     <BindingGroup Name="bindingGroup"/> 
    </StackPanel.BindingGroup> 

    <!-- This works nice! --> 
    <TextBox Text="{Binding Path=name}" /> 
    <CheckBox IsChecked="{Binding Path=enable}" /> 

    <!-- Now this work nice as well! --> 
    <ListView Name="lvBools" ItemsSource="{Binding Path=myList}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <CheckBox IsChecked="{Binding bools, BindingGroupName=bindingGroup}" /> 
          </StackPanel> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</StackPanel> 

就這麼簡單!

0

您可以將各個子項放置在相關單選按鈕的塊中。然後將每個組放在面板或多視圖中。然後讓主要的radiolist做自動回發。在回傳中讀取哪個單選按鈕被點擊/選擇,然後通過顯示相關的面板或視圖來顯示相關的子組。

如果你把它們放在一個updatepanel裏面,你可以在沒有意識到頁面刷新的情況下完成所有這些。

+0

對不起,只是這不是我正在尋找的答案。我希望能以某種方式在'DataTemplate'中添加'BindingGroup',然後在該組上執行'BeginEdit'和'CommitEdit'。 (我已經設法添加這樣一個組,但是我無法訪問它...) – Markus

+0

不確定你的意思。你無法訪問它?它可見但不可選? –

+0

看我的**編輯** – Markus

相關問題