私は最近について知りました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を実行しているためだと思います。それで、誰かがそれらのオブジェクトに到達する方法を知っていますか?