2016-08-04 23 views
0

Ich habe die folgende Bindung in XAML, IsEnabled ist vom Typ bool und Length ist eine Eigenschaft von Array, die vom Typ int ist.Binding Int-Eigenschaft zu Bool UIElement

<Button 
     Content="Press Me" 
     IsEnabled="{Binding MyArray.Length, FallbackValue=False}"> 
</Button> 

Es tut, was ich will, wenn die Feldlänge 0 ist die Funktion deaktiviert, wenn die Array-Elemente enthält es ermöglicht.

Allerdings habe ich nicht erwartet, dass es funktioniert, da Sie nicht implizit von int zu bool in C# konvertieren können.

Ist das sicher?

+1

gerade tun es WO rks bedeutet, dass IsEnabled auf "false" gesetzt ist, wenn das Array leer ist? Besser einen Bindungskonverter verwenden. – Clemens

+0

Stimmen Sie überein, verwenden Sie 'IValueConverter' oder lassen Sie eine Eigenschaft auf dem ViewModel basierend auf der Länge Ihres Arrays boolesch zurückkehren. – Michael

Antwort

1

Ist das sicher?

Kurz gesagt, ja es ist sicher - wie Sie eine FallbackValue haben, wenn die Bindung fehlschlägt.


Sie könnten eine gute ol verwenden‘DataTrigger
ich über sie in WPF vergessen hatte (ich habe viel vor kurzem auf WinRT gearbeitet - und sie sind, dass nicht verfügbar)

Dies bindet den Abzug der Length Ihrer , und dann, wenn die Bedingung erfüllt ist - stellen Sie die IsEnabled Eigenschaft der Schaltfläche (in diesem Fall) false.

<Button Content="Press Me"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyArray.Length}" Value="0"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

Binden an ein bool auf Ihrem Ansichtsmodell

Sie auch eine public bool Property auf Ihrem Ansichtsmodell verwenden könnte, und stützen dann IsEnabled dazu:

public bool IsEnabled { get { return MyArray.Length > 0; } } 

und in Ihrem Xaml:


Verwenden Sie eine IValueConverter
beste Option für alle mit WinRT

Sie könnten auch ein Converter erstellen und verwenden, die ein boolean zurück auf der Grundlage der Bedingung geben Sie nach.

Siehe http://wpftutorial.net/ValueConverters.html für ein großes Tutorial zum Implementieren von Konvertern in Ihrem WPF.

A-Wandler implementiert IValueConverter, und so etwas wie folgt aussehen:

public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Do the conversion from bool to visibility 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Do the conversion from visibility to bool 
    } 
} 

Vergessen Sie nicht, es in Ihrem Benutzersteuerung/Ansicht zu verweisen - oder sogar in Ihrem App.xaml, um es als ein StaticResource zu verwenden .

Beispiele?

Sie können Ihren eigenen Konverter beliebig nach Ihren eigenen Vorstellungen interpretieren, basierend auf Ihrer eigenen Logik.

In diesem Fall ist ein Konverter schaffen könnte, und es in der XAML verwenden, etwa so:

Sie eine ArrayNotNullOrEmptyToBooleanConverter schaffen könnte, und es in Ihrem XAML verwenden wie so:

<Button 
    Content="Press Me" 
    IsEnabled="{Binding MyArray, Converter={Binding ArrayNotNullOrEmptyToBooleanConverter}}"> 
</Button> 

Or schaffen nur einfach eine IsGreaterThanZeroToBooleanConverter und verwenden Sie dann in Ihrem XAML, etwa so:

<Button 
    Content="Press Me" 
    IsEnabled="{Binding MyArray.Length, Converter={Binding IsGreaterThanZeroToBooleanConverter}}"> 
</Button> 

hoffe, das hilft! :)

+0

Ich denke, die Frage ist, warum sollte ich besser einen Konverter erstellen? –

+0

Völlig mein Schlechter - ich hatte die alten 'DataTrigger's in WPF vergessen - Ich habe meine Antwort aktualisiert. Zumindest haben Sie ein paar Vorschläge, um eine Entscheidung zu treffen :) –

+1

Schön, dass Sie meine Antwort plagiiert haben. – Clemens

3

Dieses Verhalten scheint nirgendwo dokumentiert zu sein, also sollten Sie sich nicht darauf verlassen.

würde eine sichere und einfache Lösung eine Art mit einem Datatrigger sein:

<Button Content="Press Me"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyArray.Length}" Value="0"> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
+0

Was du darüber sagst, dass es nirgendwo dokumentiert ist, ist ein sehr guter Grund für mich, es zu ändern, danke, dass du es notiert hast. –

1

ich es funktionieren würde nicht glauben, aber es tut

Null falsch ist und alles andere ist wahr

Alles in der Abbildung ist, dass es es wie ein bisschen behandelt, wo Null falsch ist und jede andere Zahl 1 und wahr ist.
So funktioniert Bit in MS SQL Server.

Ich weiß nicht, dass Sie in zukünftigen Versionen von .NET darauf zählen können.

I funktioniert auch mit einem Rückfall
ich auf einem TextBox getestet
Es ist nicht einmal einen verbindlicher Fehler
Wenn ich ihm einen schlechten Namen geben wie iii wirft ist
ein verbindlicher Fehler Wenn Sie nicht werfen binden eine Zeichenkette, die es wirft ein verbindliches Fehler

<TextBox Grid.Row="0" Grid.Column="0" 
     IsEnabled="{Binding ii}" PresentationTraceSources.TraceLevel="High" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     Text="TexBox" /> 

public int ii { get { return 0; } } 

oder Sie können diese

public bool iiEnabled { get { return arrayLength > 0; } } 
+0

Down vote hast du die Bindung an einen int getestet. Es funktioniert. – Paparazzi

+0

Ich bin nicht sicher, warum der Downvote, entweder - aber ich stimme Ihrer Theorie zu. Mein Gedanke war, dass es mit der Bitlogik "0" oder "1" funktionieren könnte –