2012-12-19 12 views
8

[EDIT] ändern * ich die Ausnahme zurückgegebenWie WPF Rechteck Stil Programatically (MVVM) (Noob)

umfassen vergessen hatte

'System.Windows.Style' is not a valid value for property 'Fill' *

Dies ist mein erster Beitrag, ich habe bereits Ich habe viel nach Fragen gesucht, wo dies vielleicht schon erfolglos beantwortet wurde. Ich bin ein kompletter Anfänger, wenn es um MVVM, Prism und WPF geht, und ich bin auf diesem einen Punkt in die Tiefe geworfen worden.

Ich möchte den Inhalt von 2 Rechtecke abhängig von einem Boolean im Modell ändern (Binding Passed).

Wenn ein Test Pass (bool True) zurückgibt, wird die Farbe Grün für das erste Rechteck angezeigt und das zweite Rechteck zeigt den UserControl.Resource Style x: Key = "RectanglePass" an. Wenn Test, dann erste Rechteck nicht rot ist, und die zweite zeigt UserControl.Resource Stil x: Key = "RectangleFail"

ich folgende XAML-Code haben:

<UserControl x:Class="Integration.Memjet.Aoqc.Views.ProcessResultView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 

<UserControl.Resources> 
    <Style x:Key="RectangleFail" TargetType="Rectangle"> 
     <Setter Property="Fill"> 
      <Setter.Value> 
       <VisualBrush> 
        .... 
       </VisualBrush> 
      </Setter.Value> 
     </Setter> 
    </Style> 
    <Style x:Key="RectanglePass" TargetType="Rectangle"> 
     <Setter Property="Fill"> 
      <Setter.Value> 
       <VisualBrush> 
        .... 
       </VisualBrush> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="60"></RowDefinition> 
     <RowDefinition Height="60"></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20">PASS</Label> 
    <Rectangle Name="rectStatus" Grid.Row="1"> 
     <Rectangle.Style> 
      <Style TargetType="{x:Type Rectangle}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Passed}" Value="True"> 
         <Setter Property="Fill" Value="Green" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Passed}" Value="False"> 
         <Setter Property="Fill" Value="Red" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Rectangle.Style> 
    </Rectangle> 

    <Rectangle Name="rectStatusImg" Width="120" Height="120" Grid.Row="2" > 
     <Rectangle.Style> 
      <Style TargetType="{x:Type Rectangle}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Passed}" Value="True"> 
         <Setter Property="Fill" Value="{StaticResource RectanglePass}" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Passed}" Value="False"> 
         <Setter Property="Fill" Value="{StaticResource RectangleFail}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Rectangle.Style> 
    </Rectangle> 
</Grid> 
</UserControl> 

oben Das funktioniert nicht, und gibt eine Ausnahme zurück. Wenn ich das zweite Rectangle-Tag (rectStatusImg) durch diese Zeile ersetzen sollte;

<Rectangle Name="rectStatusImg" Style="{StaticResource RectanglePass}" Width="120" Height="120" Grid.Row="2" ></Rectangle> 

Der XAML funktioniert und produziert das erwartete Ergebnis! Aber ich möchte es an den Boolean Passed binden, damit ich es programmatisch ändern kann.

Ich hoffe wirklich, dass ich mein Problem hier erklären konnte.

Vielen Dank für Ihre Hilfe im Voraus, diese Seite war schon immer ein Schatz und eine große Hilfe.

Cheers, Simon

+0

Legen Sie den DataContext des UserControls überall fest? Es sieht so aus, als wären Dinge richtig eingerichtet, einschließlich der Bindung, aber es ist nicht klar, ob Sie den DataContext tatsächlich so einrichten, dass er das System anzeigt, von dem die Werte tatsächlich kommen. – Tim

+0

Hi @Tim, In der Datei View.xaml.cs hat es eine Eigenschaft fileViewModel, die DataContext als fileViewMode zurückgibt. Das Interessante ist, indem Sie DataContext dem Raster hinzufügen. Es hat aufgehört, eine Ausnahme zu erzeugen. – sayo9394

Antwort

7

definieren zwei visuelle Bürsten in Ihrer Ressource und eine Art von Rechteck mit Daten-Trigger wie

<VisualBrush x:Key="FailBrush">Black</VisualBrush> 
    <VisualBrush x:Key="PassBrush">Red</VisualBrush> 

    <Style x:Key="ColorRectangleStyle" TargetType="Rectangle"> 
     <Setter Property="Fill" Value="{StaticResource FailBrush}"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Passed}" Value="False"> 
       <Setter Property="Fill" Value="{StaticResource PassBrush}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

und verwenden Sie es in Rechteck wie

<Rectangle Name="rectStatusImg" Width="120" Height="120" Grid.Row="2" Style="{StaticResource ColorRectangleStyle}" /> 

Hoffnung schaffen es hilft.

+0

Wie kommt es, dass wir nur einen DataTrigger für den PassBrush haben? Bedeutet das, dass FailBrush standardmäßig angezeigt wird? – sayo9394

+0

Ja, und Sie werden es in Triggerpinsel per Trigger ändern. Sie können es je nach Bedarf ändern, wenn Sie nur zwei Farben haben. Das sollte in Ordnung sein. –

+0

das ist genial. Dies kann meine Antwort sein, wenn ich das Grid unsichtbar machen kann (Sichtbarkeit = "Versteckt"), dann zeige ich es am Ende des Tests und enthülle einen Pass oder einen Fehler. Ich habe Probleme, dies zu erreichen, ... – sayo9394