2017-06-22 6 views
1

Ich versuche gerade ein "stats" -Fenster zu entwerfen, von dem man weiß, dass es in RPG-Spielen zu sehen ist, zB wie viele Punkte verteilt werden Angriff, Verteidigung und Leben.WPF - Bindung an eine Integer/Double Property, um X Anzahl der Rechtecke anzuzeigen

Zum Beispiel habe ich das Property Leben in meiner Klasse, und in meiner XAML habe ich ein WrapPanel, wo ich all diese Rectangles hosten mag, dass jeder Punkt das Objekt Leben hat vertreten werden, wenn das Eigenschaft hatte den Wert "5", dann würde 5 Rectangles innerhalb dieser WrapPanel angezeigt werden.

Kann man das rein in XAML mit DataBinding tun, ohne Code schreiben zu müssen? Wenn das nicht möglich ist, ist es möglich, einen Konverter zu schreiben?

Wenn einer von denen möglich ist, wie?

Ich versuche es mit Binding zu machen, ohne Code in das Backend zu schreiben, um den Code so wenig aufgebläht und einfach wie möglich zu halten.

EDIT: Um zu klären, 5 ist nicht der Maximalwert ist, kann sie so hoch wie der Datentyp gehen gehen, so dass Sie, dass diese Rechtecke haben zu prüfen, dynamisch mit Bindung, anstatt nur das Einfügen sie eingeführt haben werden und ändere die Sichtbarkeit.

+0

Warum die downvote? Anstatt es für das Ganze zu tun, warum nicht ein Feedback geben, damit ich die Frage verbessern kann, wenn der Inhalt nicht zufriedenstellend ist? –

+0

Fügen Sie 5 Rechtecke hinzu, binden Sie ihre Sichtbarkeit an den stat-Wert und verwenden Sie "ValueConverter" für die Bindung, um sie sichtbar zu machen, wenn der Wert größer oder gleich dem Wert für diese Box ist. –

+0

Sie wissen, dass das nicht funktionieren würde, wenn diese Werte über 5 gehen, oder? Deshalb ist es in einem WrapPanel, um es automatisch horizontal und vertikal zu positionieren, abhängig davon, wie viele ... –

Antwort

2

Zuerst einen Konverter schreiben, das Array von Elementen aus bestimmten Anzahl produziert:

public class NumberToItemsConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     return Enumerable.Range(1, System.Convert.ToInt32(value)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
} 

Dann Elemente verwenden steuern:

<ItemsControl ItemsSource="{Binding Value, Converter={StaticResource numToItems}}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel IsItemsHost="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Rectangle Height="100" 
         Width="20" 
         Margin="5,0,5,0" 
         Fill="Red" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

'IsItemsHost' ist neu für mich, die Dokumentation auf MSDN erklärt nicht wirklich, warum es auch benötigt wird, können Sie diesen Teil näher ausführen? –

+0

[Dies überbrückte die Lücke für mich] (https://stackoverflow.com/questions/2859656/what-exactly-does-panel-isitemshost-do). Danke, dass du mir etwas Neues gezeigt hast. –

+0

@BradleyUffner gut in diesem Fall ist es nicht erforderlich (obwohl auch nicht schadet), ich benutze es einfach, weil ich es so gemacht habe. Es wird benötigt, wenn Sie das Panel in die Kontrollvorlage selbst platzieren (wie Sie es bereits gefunden haben). – Evk