none
x:Bind - ToggleButton in einer Windows 10 - UWP - App RRS feed

  • Frage

  • Hi,

    ich möchte in einer W10-UWP-App x:Bind nutzen. Leider finde ich keine Möglichkeit an einem ToggleButton die IsChecked Eigenschaft per x:Bind zu nutzen.

    Ich bekomme beim Versuch folgende Fehlermeldung:

    Ungültiger Bindungspfad "IsTogglePlayer1OnChecked": Typ "System.Boolean" kann ohne Konverter nicht an "System.Nullable(System.Boolean)" gebunden werden.

    Der ToggleButton sieht so aus:

    <ToggleButton Content="ON" IsChecked="{x:Bind IsTogglePlayer1OnChecked, Mode=TwoWay, Converter=MyBoolToIsCheckedConverter}"/>

    Die Property (im CodeBehind) so:

            private bool _IsTogglePlayer1OnChecked;
            public bool IsTogglePlayer1OnChecked
            {
                get { return _IsTogglePlayer1OnChecked; }
                set
                {
                    if (value != _IsTogglePlayer1OnChecked)
                    {
                        _IsTogglePlayer1OnChecked = value;
                        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsTogglePlayer1OnChecked"));
                    }
                }
            }

    Ich komme hier nicht weiter, auch folgender Blog hat mir nicht weitergeholfen. Und mit einem funktionierenden Converter, wie in der Fehlermeldung gefordert wird, bekomme ich auch nicht zum laufen.

    Gruß

    Donnerstag, 14. Januar 2016 22:26

Antworten

Alle Antworten

  • Hallo Stefan,

    mit einem Konverter funktioniert es bei mir ohne Probleme, deine Syntax um auf den Konverter zuzugreifen könnte allerdings falsch sein. Die beste Vorgehensweise besteht i.d.R. darin eine Ressource von dem Konverter anzulegen:

    <Page
        x:Class="App7.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App7"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
            <local:MyBoolToIsCheckedConverter x:Key="MyBoolToIsCheckedConverter" />
        </Page.Resources>
        <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <ToggleButton Content="ON" IsChecked="{Binding IsTogglePlayer1OnChecked, Mode=TwoWay, Converter={StaticResource MyBoolToIsCheckedConverter}}"/>
        </Grid>
    </Page>
    
    Zur Vollständigkeit, hier der Konverter:
    public class MyBoolToIsCheckedConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            if (value is bool)
            {
                return (bool?)value;
            }
            return DependencyProperty.UnsetValue;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            if (value is bool?)
            {
                return (bool)value;
            }
            return DependencyProperty.UnsetValue;
        }
    }



    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Donnerstag, 14. Januar 2016 23:18
  • Danke für die Antwort.

    Aber sie funktioniert nicht. Zugegeben, mein Konverter sah anders aus. Allerdings spielt sich das ganze in einem 'ContentDialog' ab, was eigentlich keinen Unterschied machen sollte.

    Mit dem Vorschlag oben findet keine funktionierende Bindung statt. Mein Ziel war auch 'x:Bind' zu verwenden, was bei TextBox, TextBlock und String-Propertys einwandfrei funktioniert.

    Mit einem DepencyProperty und der klassischen Bindung funktioniert das wie gewohnt ohne Konverter, aber nicht mit dem neuen, schicken, hippen x:Bind, was ich auch nicht ganz verstehe, weil da irgendwo die Durchgängigkeit fehlt...

    Freitag, 15. Januar 2016 08:19
  • Hallo Stefan,

    bis du deine Frage gestellt hast, kannte ich x:Bing nicht einmal...kenne mich also auch nicht sonderlich gut damit aus. Dass hier zwingend der Konverter vorgeschrieben wird liegt meiner Meinung nach aber vermutlich daran dass dann nicht mehr jede mögliche Konvertierung versucht werden muss, die hier eventuell vorliegt. Das übernimmt hier immer der Konverter. Das spart letzten Endes Leistung.

    Ich habe es nochmal mit einem ContentDialog versucht, und auch da gab es keine Probleme. Ich habe dir mal das schnell zusammen geschriebene Testprojekt hoch geladen: OneDrive

    Sonst habe ich erstmal auch keine weitere Idee dazu.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 15. Januar 2016 14:24
  • Vielen Dank, ich teste das mal zeitnah und gebe Rückmeldung.

    Edit:
    Ok, nochmals vielen Dank! Ich habe dein Beispiel getestet. Wo ich den Fehler habe muss ich nochmal schauen.
    Was ich noch unbedingt nachlesen muss, ist wo der Unterschied zwischen dem, in deinem Beispiel verwendeten, 'Binding' und dem 'x:Bind', welches ich verwenden wollte, liegt.

    Vielleicht auch nur eine Philosophiefrage......... 

    Da ich das erst einmal für einen ContentDialog nutzen möchte, ist hier nicht unbedingt ein Viewmodel notwendig. Da ich für jede Page in der App ein eigenes Viewmodel nutze und die ContentDialog/e an verschiedenen Stellen aufgerufen werden. Bisher habe ich PopUp's mit DepencyPropertys genutzt, bis ich das schicke x:Bind entdeckt habe. Was allerdings mit x:Bind funktioniert ist das ToggleSwitch- Control:

    <ToggleSwitch 
        OnContent="ON" 
        OffContent="WAIT" 
        IsOn="{x:Bind IsTogglePlayer1On, Mode=TwoWay}"/>
    Auf jeden Fall nochmal vielen Dank für die gute Unterstützung, die ich immer wieder hier bekomme.

    Freitag, 15. Januar 2016 19:35