ListBox項目にDataTemplateを使用すると、アプリケーションがフリーズし、出力ウィンドウに例外がスローされます。詳細は次のとおりです。リストボックスの項目のバインドモード
編集テンプレート:
<DataTemplate x:Key="EditOnlyTemplate">
<Border BorderBrush="Blue" Margin="3" Padding="3" BorderThickness="2" CornerRadius="5" Background="Beige">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical" VerticalAlignment="Center">
<TextBox Width="300" FontSize="25" Foreground="Goldenrod" Text="{Binding XPath=/doc/dob/text, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged, diag:PresentationTraceSources.TraceLevel=High}" />
<TextBox Width="300" FontSize="25" Foreground="Blue" Text="{Binding XPath=/doc/dob/group, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Width="300" FontSize="25" Foreground="Green" Text="{Binding XPath=/doc/dob/filter, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Save" Click="btnSave_Click" Width="40" HorizontalAlignment="Left" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentControl}}}"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
私は、ボタンのクリックを処理し、単純にバインドされたデータを表示するものから、私のListBox項目に私のDataTemplateを切り替えることが背景にある次のコードを使用しています(つまり、「詳細」テンプレート)バインドされたデータ(つまり、 "Edit" Template)を変更できる場所に移動します。
private void btnEdit_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
//command contains the list item
ContentControl itm = (ContentControl)btn.CommandParameter;
itm.ContentTemplate = this.FindResource("EditTemplate") as DataTemplate;
}
私EditTemplateについて注意する事は最初のTextBoxの結合様式である - それはOneWayToSourceに設定されています。これは、私がこのテンプレートで交換する "編集"ボタンをクリックすると、問題の原因になります。モードを「TwoWay」(TextBoxのデフォルトモード)に変更すると、問題はありません。また、このテンプレートのコピーをページ上の別の場所で使用すると、コードではなく、ListBoxアイテムでなく、ContentControlでOneWayToSourceモードが正常に機能します。
私の壊れたシナリオでスローされた例外は以下の通りです:
System.Windows.Data Warning: 104 : BindingExpression (hash=48690759): At level 0 - for XmlElement.InnerText found accessor ReflectPropertyDescriptor(InnerText)
System.Windows.Data Warning: 100 : BindingExpression (hash=48690759): Replace item at level 0 with XmlElement (hash=21889970), using accessor ReflectPropertyDescriptor(InnerText)
System.Windows.Data Warning: 86 : BindingExpression (hash=48690759): Update - got raw value ''
System.Windows.Data Warning: 90 : BindingExpression (hash=48690759): Update - using final value ''
System.Wi
ndows.Data Warning: 98 : BindingExpression (hash=48690759): SetValue at level 0 to XmlElement (hash=21889970) using ReflectPropertyDescriptor(InnerText): ''
A first chance exception of type 'System.InvalidOperationException' occurred in WindowsBase.dll
System.Windows.Data Error: 8 : Cannot save value from target back to source. BindingExpression:Path=/InnerText; DataItem='XmlDocument' (HashCode=33583636); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') InvalidOperationException:'System.InvalidOperationException: Dispatcher processing has been suspended, but messages are still being processed.
at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
at MS.Internal.Data.PropertyPathWorker.SetValue(Object item, Object value)
at MS.Internal.Data.ClrBindingWorker.UpdateValue(Object value)
at System.Windows.Data.BindingExpression.UpdateSource(Object value)'
私はリストボックスは何とか原因である疑いがあるが、可能なバグを除き、理由を理解することはできません。 Windows XPでは、現在のすべての更新プログラムで.Net Framework 3.5を使用しています。誰かが私がやろうとしていることを明らかに間違って見ているのですか?
こんにちはアーロン、チップをありがとう。私は将来DataTemplateSelectorを確実に使用しますが、私が見ているこのバインディングの問題にどのように影響するかはっきりしていません。 DataTemplateSelectorの意図された使用は、リストボックス内のさまざまなタイプのアイテムを表示するためですが、私がしようとしているのは、バインドされたデータの別の「モード」を実装することです。私はそれを試してみましょう。 – Bill