ListView中的BindingGroup与DataTemplate

时间:2012-11-23 12:39:46

标签: c# wpf binding

我最近发现了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中点击它们)时,源代码不会更新,这很好,但现在我找不到保存方法(提交)数据。 我无法从代码隐藏中访问SPpanBGStackPanel。 但是我尝试了以下内容:

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

但这也没有成功......

修改 好的,所以编辑II ...所以我猜这个源没有更新的原因是因为我在模板上运行Begin / CommitEdit而不是从模板创建的实际对象。那么有谁知道如何达到这些对象?

2 个答案:

答案 0 :(得分:1)

好的,谢谢先生E.L Dunn我要管理这个问题!

所以在我的第一次编辑中,我建议我可以在BindingGroup的{​​{1}}中添加StackPanel,这样做的方向正确......

所有需要做的就是在DataTemplate的CheckBox中添加DataTemplate

BindingGroupName

这很简单!

答案 1 :(得分:0)

您可以将各种子项目放在相关单选按钮的块中。然后将每个组放在面板或多视图中。然后让主要的radiolist做自动回发。在回读时,单击/选择了哪个单选按钮,然后通过显示相关的面板或视图显示相关的子组。

如果您将这些内容放在更新面板中,则可以在不刷新页面的情况下完成所有这些操作。