2013-08-06 7 views
8

Gute Zeit. Ich habe ein Problem mit der Datenbindung in WPF. Wenn ich verbindlich:Markup.IStyle.Connector.Connect Fehler beim Binden in WPF

<TextBlock Text="{Binding Key}" TextTrimming="CharacterEllipsis" 
MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource 
AncestorType={x:Type Expander}}, Converter={StaticResource string_cutter_width}}"/> 

in Code unten ich einen Markup.IStyle.Connector.Connect Fehler auf einigen Computern haben. Ich kann nicht verstehen warum. Wenn Sie solch ein Verhalten getroffen haben oder ein paar Ideen dazu haben. BITTE TEILEN.

  <DataGridTemplateColumn Header="{x:Static res:Resources.status_col_header}" Width="1*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <DataTemplate.Resources> 
          <local:Localizer2 x:Key="Localizer2" /> 
         </DataTemplate.Resources> 
         <Expander Header="{Binding status.Text, Converter={StaticResource Localizer2}}" MouseEnter="Expander_MouseEnter" Tag="{Binding}"> 
          <TreeView x:Name="GTree" ItemsSource="{Binding status.files}" ScrollViewer.HorizontalScrollBarVisibility="Hidden"> 
           <TreeView.ItemTemplate> 
            <DataTemplate> 
             <StackPanel Orientation="Horizontal" ClipToBounds="False" IsHitTestVisible="true" Margin="1"> 
              <StackPanel Orientation="Vertical"> 
               <StackPanel.Resources> 
                <local:string_cutter_width x:Key="string_cutter_width" /> 
               </StackPanel.Resources> 
               <TextBlock Text="{Binding Key}" TextTrimming="CharacterEllipsis" MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Expander}}, Converter={StaticResource string_cutter_width}}"/> 
               <TextBlock Text="{Binding Value}" TextTrimming="CharacterEllipsis" MaxWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type Expander}}, Converter={StaticResource string_cutter_width}}"/> 
               <!--<TextBlock Text="{Binding Key}" TextTrimming="CharacterEllipsis"/> 
               <TextBlock Text="{Binding Value}" TextTrimming="CharacterEllipsis"/>--> 
              </StackPanel > 
              <StackPanel Orientation="Vertical" HorizontalAlignment="Right" VerticalAlignment="Center"> 
               <StackPanel.Resources> 
                <local:del_label_converter x:Key="del_label_converter" /> 
               </StackPanel.Resources> 
               <!--<Image Source="Resources\delete_16.png" Stretch="UniformToFill" PreviewMouseUp="Image_MouseUp" Width="16" Height="16" Tag="{Binding}" Visibility="{Binding IsEnabled, ElementName=start_btn, Converter={StaticResource del_label_converter} }"/>--> 
               <Image Source="Resources\delete_16.png" Stretch="UniformToFill" PreviewMouseUp="Image_MouseUp" Width="16" Height="16" Tag="{Binding}"/> 
              </StackPanel> 
             </StackPanel> 
            </DataTemplate> 
           </TreeView.ItemTemplate> 
          </TreeView> 
         </Expander> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 

     <DataGrid.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Проверка подключения CamDrive" Click="MenuItem_Click" IsEnabled="{Binding Path=camdrive_can_be_chk_manually}"/> 
       <!--<MenuItem Header="Перезагрузка камеры" Click="RebootCamera_Click"/>--> 
      </ContextMenu> 
     </DataGrid.ContextMenu> 
    </DataGrid> 

Call-Stack:

в Camdrive.UpgradeTools.MainWindow.System.Windows.Markup.IStyleConnector.Connect(Int32 connectionId, Object target) в c:\Develop\Camdrive.Utils\Camdrive.UpgradeTools\Camdrive.UpgradeTools\MainWindow.xaml:строка 75 
в System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter) 
в System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter) 
в System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField) 
в System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren) 
в System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate) 
в System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container) 
в System.Windows.FrameworkElement.ApplyTemplate() 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint) 
в System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.Border.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.Control.MeasureOverride(Size constraint) 
в System.Windows.Controls.DataGridCell.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.DataGridCellsPanel.MeasureChild(UIElement child, Size constraint) 
в System.Windows.Controls.DataGridCellsPanel.GenerateChild(IItemContainerGenerator generator, Size constraint, DataGridColumn column, Int32& childIndex, Size& childSize) 
в System.Windows.Controls.DataGridCellsPanel.GenerateChildren(IItemContainerGenerator generator, Int32 startIndex, Int32 endIndex, Size constraint) 
в System.Windows.Controls.DataGridCellsPanel.GenerateAndMeasureChildrenForRealizedColumns(Size constraint) 
в System.Windows.Controls.DataGridCellsPanel.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint) 
в System.Windows.Controls.ItemsPresenter.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.Control.MeasureOverride(Size constraint) 
в System.Windows.Controls.Primitives.DataGridCellsPresenter.MeasureOverride(Size availableSize) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV) 
в System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV) 
в System.Windows.Controls.Grid.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.Border.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.Control.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.Controls.VirtualizingStackPanel.MeasureOverride(Size constraint) 
в System.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride(Size constraint) 
в System.Windows.FrameworkElement.MeasureCore(Size availableSize) 
в System.Windows.UIElement.Measure(Size availableSize) 
в System.Windows.ContextLayoutManager.UpdateLayout() 
в System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg) 
в System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork() 
в System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() 
в System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget) 
в System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) 
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
в System.Windows.Threading.DispatcherOperation.InvokeImpl() 
в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
в System.Threading.ExecutionContext.runTryCode(Object userData) 
в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
в System.Windows.Threading.DispatcherOperation.Invoke() 
в System.Windows.Threading.Dispatcher.ProcessQueue() 
в System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
в System.Windows.Application.RunDispatcher(Object ignore) 
в System.Windows.Application.RunInternal(Window window) 
в System.Windows.Application.Run(Window window) 
в System.Windows.Application.Run() 
в Camdrive.UpgradeTools.App.Main() в C:\Develop\Camdrive.Utils\Camdrive.UpgradeTools\Camdrive.UpgradeTools\obj\x86\Debug\App.g.cs:строка 0 
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
в System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
в System.Threading.ThreadHelper.ThreadStart() 

Antwort

12

Wahrscheinlich ist es wegen der verschachtelten Vorlagen:

Celltemplate ->DataTemplate -> ... -> TreeView -> TreeView.ItemTemplate ->DataTemplate

Zitiert this:

Dieser Fehler erfordert eine Vorlage in einer Vorlage. Ein guter Weg, um dieses Problem zu betrachten "Templating ist wie Klammern, zitiert Klammern" das Template XAML wird nicht erstellt, sondern gespeichert und später ausgeführt. Der Fehler ist daher: Wir haben ein Problem mit verschachtelten Klammern.

In der Probe:

<Grid> 
    <ListBox ItemsSource="{StaticResource Data}" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <ListBox ItemsSource="{Binding .}"> 
        <ListBox.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding .}" Width="30" 
            Loaded="TextBlock_Loaded" 
            Style="{StaticResource TextBlockStyle}" /> 
         </DataTemplate> 
        </ListBox.ItemTemplate> 
       </ListBox> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Die innere Vorlage noch quoted wenn die äußeree Vorlage angewandt wird. Dennoch nennen wir immer noch IStyleConnector.Connect() für alle XAML (wir hören nicht auf, wenn wir inner parentheses/quote treffen) und es gibt keine TextBlock-Instanz, so dass wir abstürzen.

Mit der Repro wird wegen der optimierten Vorlagenfreigabe Unbehagen verursacht. wenn Sie entfernen Zum Beispiel der:

Style="{StaticResource TextBlockStyle}" 

Der Fehler geht weg, weil die TextBlock- sharable im Template-Optimierer wird.

WorkAround:

Die beste Arbeit um ist die innere Vorlage auf eine Ressource bewegen.

Versuchen Sie, Ihre TreeView.ItemTemplate in Ressource zu verschieben.

+2

Danke. Es hat mir sehr geholfen. –

+1

Gibt es eine bestimmte Version von .NET, die dieses Problem hat? Warum zeigen einige Maschinen dieses Problem, andere nicht? Ihre Problemumgehung und Anregung funktionierte wie ein Charme! –

+0

@Mike G: Welche Versionen von Frameworks auf Maschinen? Dieser Fehler wurde von '.NET 3.5' ​​nach' .NET 4.0' Version verschoben, genau der gleiche Code unter 3.5 hat keine Probleme. Es ist möglich, in der Version 4.5 ist es behoben, wie von Microsoft versprochen. Auf jeden Fall sollten, wie ich denke, Verschachtelungsvorlagen vermieden und durch Ressourcen genutzt werden. –

Verwandte Themen