我最近发现了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; }
}
因此,当我更改名称或按下启用CheckBox时,直到我按下SaveButton(btnSave_Click)(未包括在XAML
中)之后才会提交这些更改
或者如果我按下取消按钮,则“恢复”更改。
但是,如果我单击ListView中的一个复选框,则会立即提交这些更改。
我自己的猜测:ListView(或者甚至是StackPanel
中的DataTemplate
)会停止BindingGroup
继承链。但在那种情况下,我怎么能包括它们呢?
修改
我还尝试向DataTemplate添加一个新的BindingGroup
:
<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而不是从模板创建的实际对象。那么有谁知道如何达到这些对象?
答案 0 :(得分:1)
好的,谢谢先生E.L Dunn我要管理这个问题!
所以在我的第一次编辑中,我建议我可以在BindingGroup
的{{1}}中添加StackPanel
,这样做的方向正确......
所有需要做的就是在DataTemplate的CheckBox中添加DataTemplate
。
BindingGroupName
这很简单!
答案 1 :(得分:0)
您可以将各种子项目放在相关单选按钮的块中。然后将每个组放在面板或多视图中。然后让主要的radiolist做自动回发。在回读时,单击/选择了哪个单选按钮,然后通过显示相关的面板或视图显示相关的子组。
如果您将这些内容放在更新面板中,则可以在不刷新页面的情况下完成所有这些操作。