2

私は最近について知りました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; }
}

名前を変更するか、チェックボックスを有効にすると、SaveButton(btnSave_Click)(に含まれていませんXAML)を押すか、[キャンセル]ボタンを押すと変更が「復元」されるまで、これらの変更は送信されません。 。ただし、ListViewのチェックボックスの1つをクリックすると、それらの変更はすぐに送信されます。

私自身の推測:ListView(またはおそらくStackPanel内の)は継承チェーンを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();

しかし、これも成功しませんでした...

編集 OK、編集II ...ソースが更新されない理由は、テンプレートから作成された実際のオブジェクトではなく、テンプレートでBegin/CommitEditを実行しているためだと思います。それで、誰かがそれらのオブジェクトに到達する方法を知っていますか?

4

2 に答える 2

1

さて、 EL Dunn氏のおかげで、私はこれを解決するために管理します!

だから私の最初の編集で私は多分ににを追加することができると提案しBindingGroupましStackPanelDataTemplate、そしてそれは一種の正しい方向でした...

実行する必要があるのはBindingGroupName、DataTemplateのチェックボックスにを追加することだけです。

<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>

そのような単純な!

于 2012-12-04T08:57:17.783 に答える
0

関連するラジオボタンのブロックにさまざまなサブアイテムを配置できます。次に、各グループをパネルまたはマルチビューに配置します。次に、メインのラジオリストに自動ポストバックを実行させます。ポストバックで、どのラジオボタンがクリック/選択されたかを読み取り、関連するパネルまたはビューを表示して、関連するサブグループを表示します。

これらを更新パネル内に配置すると、ページを更新することなく、これらすべてを実行できます。

于 2012-11-23T12:47:34.190 に答える