2013-08-06 13 views
8

Dobry czas. Mam problem z powiązaniem danych w WPF. Jeśli używam wiązania:Markup.IStyle.Connector.Connect błąd wiązania w WPF

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

w kodzie poniżej mam Markup.IStyle.Connector.Connect błąd na niektórych komputerach. Nie mogę zrozumieć, dlaczego. Jeśli spotkałeś się z takim zachowaniem lub masz jakieś pomysły na ten temat. PROSZĘ PODZIEL SIĘ.

  <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> 

stosu wywołań:

в 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() 

Odpowiedz

12

Najprawdopodobniej to dlatego zagnieżdżonych szablonów:

CellTemplate ->DataTemplate -> ... -> TreeView -> TreeView.ItemTemplate ->DataTemplate

Cytowanie this:

Ten błąd wymaga szablonu w szablonie. Dobrym sposobem na obejrzenie tego problemu "Templowanie jest jak nawiasy, cytując nawiasy" Szablon XAML nie jest tworzony, ale zapisywany i uruchamiany później. Błąd jest następujący: Mamy problem z zagnieżdżonymi nawiasami.

W próbce:

<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> 

wewnętrzny wzornik jest nadal quoted gdy jest stosowana zewnętrzna szablonu. Nadal jednak nazywamy IStyleConnector.Connect() dla wszystkich XAML (nie zatrzymujemy się, gdy uderzymy w inner parentheses/quote) i nie ma instancji TextBlock, więc ulegamy awarii.

Weirdness dzieje się z repro ze względu na zoptymalizowane udostępnianie szablonów. Na przykład, jeśli usunąć:

Style="{StaticResource TextBlockStyle}" 

Błąd odchodzi bo TextBlock staje sharable w optymalizator szablonu.

WorkAround:

najlepszą pracę wokół jest przesunąć wewnętrzny szablon do zasobu.

Spróbuj przenieść swój TreeView.ItemTemplate do zasobu.

+2

Dziękuję. Bardzo mi to pomogło. –

+1

Czy istnieje konkretna wersja .NET, która ma ten problem? Dlaczego niektóre komputery wykazują ten problem, a inne nie? Twoje obejście i sugestia działały jak czar! –

+0

@Mike G: Jakie wersje frameworków na maszynach? Ten błąd został przeniesiony z '.NET 3.5' ​​do wersji .NET 4.0', dokładnie ten sam kod pod 3.5 nie ma problemów. W wersji 4.5 jest to możliwe, zgodnie z obietnicą Microsoft. W każdym razie, jak sądzę, należy unikać szablonów zagnieżdżania i korzystać z zasobów. –

Powiązane problemy