我最近发现了BindingGroups
,它看起来相当不错。但我无法让它在我ListView
充满了DataTemplates
.
(提前我只想说:对不起所有的代码,只是为了让你更好地理解)
所以在 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>
和代码隐藏:
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; }
}
那么当我更改名称或按下启用复选框时会发生什么,直到我按下保存按钮(btnSave_Click)(不包含在XAML
)或如果我按下取消按钮更改是“恢复” . 但是,如果我单击 ListView 中的复选框之一,这些更改将立即提交。
我自己的猜测: ListView (甚至可能是StackPanel
in DataTemplate
)停止了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,而不是在从模板创建的实际对象上运行。那么有人知道如何到达这些物体吗?