我最近發現了約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,而不是從模板創建的實際對象。那麼是否有人知道如何達到這些目標?
對不起,只是這不是我正在尋找的答案。我希望能以某種方式在'DataTemplate'中添加'BindingGroup',然後在該組上執行'BeginEdit'和'CommitEdit'。 (我已經設法添加這樣一個組,但是我無法訪問它...) – Markus
不確定你的意思。你無法訪問它?它可見但不可選? –
看我的**編輯** – Markus