2016-07-06 5 views
-1

Ich habe Probleme, ein ItemsControl an eine Sammlung zu binden, die bereits Shapes enthält. Ich benötige kein DataTemplate, aber ich möchte die Position "Top/Left" der in der Sammlung enthaltenen Elemente angeben.Angeben von linken, oberen Koordinaten in ItemsControl mit Formelementen

<ItemsControl x:Name="regions" DataContext="{Binding Path=Model}" ItemsSource="{Binding Path=Items}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <Canvas x:Name="canvas" Background="Yellow" /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 

public Model Model {get;} 
public class Model : INotifyPropertyChanged 
{ 
    public ObservableCollection<Element> Items {get;} 
} 
public class Element : Shape 
{ 
    public override System.Windows.Media.Geometry Geometry {get;} 
} 

Ich versuchte, die ItemsControl.ItemContainerStyle, aber ich habe diese Bindung Fehler:

     <ItemsControl.ItemContainerStyle> 
         <Style> 
          <Setter Property="Canvas.Left" Value="{Binding Geometry.Bounds.Left}" /> 
          <Setter Property="Canvas.Top" Value="{Binding Geometry.Bounds.Top}" /> 
         </Style> 
        </ItemsControl.ItemContainerStyle> 

System.Windows.Data Error: 40 : BindingExpression path error: 'Geometry' property not found on 'object' ''Model' (HashCode=41545796)'. BindingExpression:Path=Geometry.Bounds.Top; DataItem='Model' (HashCode=41545796); target element is 'Element' (Name=''); target property is 'Top' (type 'Double') 

Es ist wie die Eigenschaft Geometrie schaut auf das Modell angewendet wird, anstatt das Element.

Ich habe einen Konverter für Debug-Zwecke:

<Setter Property="Canvas.Left" Value="{Binding ., Converter={StaticResource debugConverter}}" /> 

Wenn ich einen Haltepunkt in DebugConverter gesetzt, die in „Objekt“ bestanden sind vom Typ Modell eher als das Element. Das scheint falsch, ich würde erwarten, dass es das Element ist. Wie erhält man das Element?

+0

Anscheinend ist Ihre Datenelementklasse aus irgendeinem Grund nicht Element, sondern Model (siehe 'DataItem = 'Model' in der verbindlichen Fehlermeldung). Das entspricht nicht dem Code, den Sie hier zeigen. – Clemens

+0

Darüber hinaus deklariert 'public Model Model = new Model();' keine Eigenschaft, die für 'DataContext =" {Binding Path = Model} "erforderlich wäre. Entfernen Sie diese DataContext-Deklaration, und versuchen Sie stattdessen < '. – Clemens

+0

Tatsächlich kennt Styles in WPF nichts über echten DataContext und es gibt keine Möglichkeit, es zu ändern. Also ignoriere diesen Fehler einfach. Stil sieht gut aus. Sie können den Eigenschaftstyp auch 'qualifizieren': 'Value =" {Binding (Element.Geometry) .Bounds.Left} "' – cdmnk

Antwort

-1

Es scheint ein bekanntes Problem mit dem DataContext zu sein, der auf einem ItemContainerStyle "zurückgesetzt" wird, da es vor dem Binden ausgewertet wird. Am Ende habe ich nur Canvas.SetLeft() und Canvas.SetTop() aufgerufen, wenn ich das Modell konstruiere. Keine ideale Lösung, aber es hat funktioniert.

+0

Bitte geben Sie einen Link zum "bekannten Problem" an. – Clemens

Verwandte Themen