对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从一个简单地显示绑定数据(即“详细信息”模板)切换到我可以修改绑定数据的那个(即,“编辑”模板)。
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)'
我怀疑ListBox是某种原因,但不能理解为什么,除了可能的bug。我在Windows XP上使用.Net Framework 3.5和所有当前更新。有没有人看到我试图做的事情明显错误?
答案 0 :(得分:0)
忽略异常并帮助您超越当前的实现,您应该使用DataTemplateSelector
。这是一个sample,发生在ListBox
。
答案 1 :(得分:0)
OneWayToSource尝试更新您的绑定数据,这可能是不可能的。 OneWay绑定应该可以正常工作。