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>
내가 버튼 클릭을 처리하고 간단하게 바인딩 된 데이터를 표시 하나에서 내 목록 상자 항목 내 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에 대해주의 할 것은 첫 번째 텍스트 상자의 바인딩 모드입니다 - 그것은 OneWayToSource로 설정됩니다. 이것이 내가이 템플릿에서 교체하는 "수정"버튼을 클릭 할 때 문제를 일으키는 원인입니다. 모드를 "TwoWay"(TextBox의 기본 모드)로 변경하면 아무런 문제가 없습니다. 또한 페이지의 다른 위치에이 템플릿의 복사본을 사용하는 경우 코드없이 ListBox 항목이 아닌 디자인 중에 배치되지만 ContentControl에서는 OneWayToSource Mode가 예상대로 작동합니다.
내 고장 시나리오에 던져 예외는 다음과 같습니다 :
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의 의도 된 용도는 ListBox에 여러 유형의 항목을 표시하는 반면, 내가하려고하는 것은 바운드 데이터에 대해 다른 "모드"사용을 구현하는 것입니다. 나는 그것에게 시도를 줄 것이다. – Bill