2017-03-15 12 views
1

XAML Designer Entwurfsansicht zeigtDer Wert darf nicht null sein. Parametername: Taste (geschieht nur auf XAML Designer Design-Ansicht)

Eine Ausnahme

Argument geworfen wurde: Der Wert darf nicht null sein.

Parametername: Schlüssel

Stacktrace (siehe nach Foto)

Innerexception: Keine

ich für ein paar Tage auf dem folgenden Problem haben zu kämpfen, die mich daran hindert, unter Verwendung XAML Designe r Entwurfsansicht auf jeder betroffenen Ansicht.

Gestern gelang es mich schließlich dieses seltsame Verhalten zu isolieren, die es besonders schwer zu verfolgen, da sie nur zur Entwurfszeit geschieht, und das scheint eine conflit zwischen generischer Art und Datagrid ‚s Itemssource-Eigenschaft (System.Windows .Steuerelemente).

Also, das ist, was auf der Entwurfsansicht gezeigt wird

enter image description here

bei System.Collections.Generic.Dictionary 2.FindEntry(TKey key) at System.Collections.Generic.Dictionary 2.TryGetValue (TKey Schlüssel, TValue & Wert) bei System.Windows.Controls.DataGridItemAttachedStorage.TryGetValue (Objekt Element, Eigenschaft DependencyProperty, Objekt & Wert) um System.Windows.Cont rols.DataGridRow.RestoreAttachedItemValue (DependencyObject objectWithProperty, DependencyProperty Eigenschaft) bei System.Windows.Controls.DataGridRow.SyncProperties (Boolean forcePrepareCells) bei System.Windows.Controls.DataGridRow.PrepareRow (Object Artikel, DataGrid- owningDataGrid) bei System.Windows.Controls.DataGrid.PrepareContainerForItemOverride (DependencyObject Element, Objektposition) bei System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.PrepareItemContainer (DependencyObject Behälter, Objektposition) bei System.Windows. Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.PrepareItemContainer (DependencyObject Container) bei System.Windows.Controls.VirtualizingStackPanel.InsertContainer (Int32 child, UIElement Behälter, Boolean isRecycled) bei System.Windows.Controls.VirtualizingStackPanel.AddContainerFromGenerator (Int32 child, UIElement Kind, Boolean newlyRealized, Boolean isBeforeViewport) um System.Windows.Controls.VirtualizingStackPanel.MeasureChild (IItemContainerGenerator & Generator, IContainItemStorage & itemStorageProvider, IContainItemStorage & parentItemStorageProvider, & parentItem Objekt, Boolean & hasUniformOrAverageContainerSizeBeenSet, Doppel & computedUniformOrAverageContainerSize, Doppel & computedUniformOrAverageContainerPixelSize, Boolean & computedAreContainersUniformlySized, IList & Artikel, Objekt & Artikel, IList & Kinder, Int32 & child, Boolean & visualOrderChanged, Boolean & isHorizontal, Größe & childConstraint, Rect & Ansichtsfenster VirtualizationCacheLength & cachesize, VirtualizationCacheLengthUnit & cacheUnit, Boolean & foundFirstItemInViewport, Double & firstItemInViewportOffset, Größe & stackPixelSize, Größe & stackPixelSizeInViewport, Größe & stackPixelSizeInCacheBeforeViewport, Größe & StapelPixelSizeInCacheAfterViewport, Größe & stackLogicalSize, Größe & stackLogicalSizeInViewport, Größe & stackLogicalSizeInCacheBeforeViewport, Größe & stackLogicalSizeInCacheAfterViewport, Boolean & mustDisableVirtualization, Boolean isBeforeFirstItem, Boolean isAfterFirstItem, Boolean isAfterLastItem, Boolean skipActualMeasure, Boolean skipGeneration, Boolean & hasBringIntoViewContainerBeenMeasured, Boolean & hasVirtualizingChildren) unter System.Windows.Controls.VirtualizingStackPanel.MeasureOverrideImpl (Größe const Raint, Nullable previouslyMeasuredOffsets, Nullable`1 & lastPagePixelSize, Boolean Aufm) bei System.Windows.Controls.VirtualizingStackPanel.MeasureOverride (Size constraint) bei System.Windows.Controls.Primitives.DataGridRowsPresenter.MeasureOverride (Size constraint) bei System.Windows.FrameworkElement.MeasureCore (Size availableSize) bei System.Windows.UIElement.Measure (Size availableSize) bei System.Windows.ContextLayoutManager.UpdateLayout() bei System.Windows.UIElement.UpdateLayout ()

Sample project source code

MyViewModelbase.cs (dies ist meine allgemeine Ansicht Modellbasis)

namespace BugProof.ViewModels 
{ 
    using System.Collections.Generic; 

    public class MyViewModelBase<TItem> where TItem : class 
    { 
     public List<TItem> Items { get; set; } 
     public MyViewModelBase() { } 
    } 
} 

MyExtendedViewModel.cs (das ist meine erweiterte Ansicht Modell, das auf einem String Typ basieren wird)

namespace BugProof.ViewModels 
{ 
    public class MyExtendedViewModel : MyViewModelBase<string> 
    { 
     public MyExtendedViewModel() 
     { 
     } 
    } 
} 

MainWindow.xaml

<Window x:Class="BugProof.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:vm="clr-namespace:BugProof.ViewModels" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:BugProof" 
     mc:Ignorable="d" 
     d:DataContext="{d:DesignInstance {x:Type vm:MyExtendedViewModel}, IsDesignTimeCreatable=False}"     
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <TextBlock>This is what you should se in the designer</TextBlock> 
     <!--Try replacing following DataGrid by a ListBox or ListView--> 
     <DataGrid ItemsSource="{Binding Items}"/> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs (Mainwindow Code hinter)

using System.Windows; 

namespace BugProof 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Komplement Berich Details:

  • Das Verhalten tritt nicht auf, wenn man Datagrid Steuerung durch einen Listbox ersetzt Listview oder Items
  • Ich verwende Visual Studio 2015, Version 14.0.25431.01-Update 3
  • Das Projekt ist auf ausgerichtet. Net Framework 4.5
+1

Haben Sie versucht, einen nicht statischen Standardwert für die Sammlung zu verwenden, z.() => neue Liste ())? –

+0

Ich denke, Sie sollten testen, wenn Sie das Get on Items tun, wenn der Rückgabewert Null ist oder nicht – Safe

+0

Hallo Geert van Horrik.Wenn ich es mit nicht statischen Werten versuche, bekomme ich das gleiche Ergebnis. Wenn jedoch Liste von List auf meiner MyViewModelBase-Klasse ersetzen, funktioniert alles. Es scheint ein Konflikt mit dem generischen Typ zu sein. –

Antwort

4

Einstellung IsDesignTimeCreatable = True auf MainWindows.xaml den Trick, obwohl es besondere Pflege erfordert Parameter lose Konstruktor Ansicht Modell Implementierung zu prüfen, ob Code in Entwurfszeit oder nicht aktiv.

According to Microsoft, IsDesignTimeCreatable = True Einstellung "gibt an, dass die Design-Instanz aus Ihrem Typ erstellt wird, anstelle eines Designer generierten Ersatztyp".

überraschenderweise auch according to Microsoft, wenn IsDesignTimeCreatable gesetzt oder auf Falsch, „all das Design-Tool macht, ist die Klasse für seine bindungsfähigen Eigenschaften analysieren“.

Ich denke, wir haben zwei entgegengesetzte Wahrheiten. Dies kann sogar der Fall sein, dass beide wirklich wahr sind, abhängig vom Kontext. Mag sein, war die zweite Quelle nicht bekannt, auf das Schreiben von Dokumentation Zeit, die 3 Proben, die XAML Designer automatisch erzeugt, sobald IsDesignTimeCreatable gesetzt Falsch auf Standardwert, wann immer es eine Sammlung (IEnumerable) Immobilie

findet Bis Beweis ansonsten ist dies ein WPF Datagrid Steuer Fehler beim Itemssource auf eine generische Sammlung Quelle binded und IsDesignTimeCreatable = false, da diese Frage Problem tritt nicht auf, wenn wir Listview von ListBox, Datagrid-Steuerelement ersetzen oder ItemsControls.

Verwandte Themen