Xaml binding

Status
Niet open voor verdere reacties.
Het werkt dus allemaal al?
Je kunt ze daar best neer zetten maar je gebruikt ze nergens anders dus heeft het niet veel zin.

Het is allemaal niet meer zo overzichtelijk met half binding / half naam van control gebruiken om data te krijgen of er heen te sturen. Ook zou het fijn zijn als je de 'Add' button disabled als de waarden in de textboxen niet voldoen aan de eisen.

Ik kan wel eens een voorbeeldje maken met wat meer binding zodat je daar eens naar kunt kijken.
 
ja zou je eens een voorbeeldje kunnen maken

want het is idd een warboel geworden dat is idd een heel goede oplossing om die button te disabelen als
de voorwaarden niet juist zijn. Ik denk dus dat dit ook moet worden gecontroleerd via binding
ik ben bijna bij mijn juiste oplossing maar het disabelen weet ik echt niet hoe ik dat zou moeten doen
en die warboel ja dat komt door van alles te proberen en de weinige kennis van xaml en binding lol

alvast heel erg bedankt
 
erg bedankt ik ben nu ook bezig met nog wat te proberen


ja me button word al gedisabeled als de voorwaarden van mijn bedrag niet in orde zijn maar
ben nu bezig om dit ook voor mijn naam en beschrijving te doen dus als er niks is ingevuld in die tekstboxen dat je dan ook niet op de button kan drukken

ik heb daar dus een klasse voor gemaakt maar het werkt niet

dus bovenste klasse werkt onderste klasse werkt niet

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace Takenlijst
{

    class GetalValidatieRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            int cijferwaarde;
            try
            {
                cijferwaarde = Convert.ToInt32(value);
            }
            catch (FormatException)
            {
                return new ValidationResult(false, " Ingegeven waarde is geen integer");
            }
            if(cijferwaarde < 0 )
            {
                return new ValidationResult(false, "Niet onder nul");
            }
            else
            {
                return ValidationResult.ValidResult;
            }

        }
    }
Code:
    class TekstValidationRule : ValidationRule
    {

        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string tekstwaarde;
            try
            {
                tekstwaarde = Convert.ToString(value);
            }
            catch (OverflowException)
            {
                return new ValidationResult(false, "Je omschrijving of Naam zijn te lang");
            }
            if (tekstwaarde == null)
            {
                return new ValidationResult(false, "gelieve tekst in te vullen");
            }
            else
            {
                
                return ValidationResult.ValidResult;
               
            }

        }
    }
}
 
Gisteren geen tijd meer gehad, bij deze een voorbeeld met binding.

Je bind in principe een class (ViewModel) aan de pagina (hier in de constructor) en vanaf deze class haal je alles wat je nodig hebt doormiddel van binding.

- name textbox binding
- age textbox binding
- create button enable/disable binding
- persons listbox itemssource binding

- je kunt ook de title van het view binden en dan dus in het viewmodel wijzigen, hier niet gedaan


De INotifyPropertyChanged interface zorgt ervoor dat wanneer je iets wijzigd er een event wordt getriggered waar andere op kunnen reageren dit wordt automatisch gedaan als je bind in xaml.


Zo heb je in je view in principe alleen maar xaml staan en is de code behind file vrijwel leeg (met command binding zou er alleen 1 regel staan in de constructor, en zou dit zelfs in xaml alleen kunnen)
Om de werking te wijzigen hoef je alleen maar je viewmodel class te wijzigen en niets in je view.

En zoals je kunt zien heeft geen enkel control een naam in dit view.


https://dl.dropboxusercontent.com/u/63676419/BindingSample.rar

346vkwo.png



buttons kun je ook binden met een command (ICommand interface), deze kan meteen de enabled/disabled voor de button doen, het view hoeft dan niet een create method op het button click event aan te roepen maar wordt dus ook gebind
(hier niet gedaan om niet meteen lastig te gaan doen met commands in een simpel binding voorbeeld)
 
Laatst bewerkt:
bedankt dit is echt een goed voorbeeld voor binding maar ik zit nu nog met 1 klein probleempje achter dit probleempje werkt mijn wenslijst eindelijk

het probleem is met mijn bedrag met int is er geen probleem maar voor mijn naam en omschrijving in string dus wel

dan zegt hij in de beschrijving van de fout dat hij het niet kan converteren maar int ingeven lukt dan wel weer


int code die wel werkt

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace Takenlijst
{

    class GetalValidatieRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            int cijferwaarde;
            try
            {
                cijferwaarde = Convert.ToInt32(value);
            }
            catch (FormatException)
            {
                return new ValidationResult(false, " Ingegeven waarde is geen getal");
           }
            if(cijferwaarde < 0 )
            {
                return new ValidationResult(false, "Bedrag kan niet negatief zijn");
            }
            if (cijferwaarde > 500)
            {
                return new ValidationResult(false, "gelieve een bedrag in te vullen lager dan 500");
            }
            else
            {
                return ValidationResult.ValidResult;
            }

        }
    }

string code die niet werkt behalve als ik int in de tekstbox invul dan wil hij wel converteren en toevoegen
Code:
public class TekstValidationRule : ValidationRule
    {
       
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
             string tekstwaarde;
            try
            {
                tekstwaarde = Convert.ToString("");
            }
            catch (OverflowException)
            {
                return new ValidationResult(false, "Je omschrijving of Naam zijn te lang");
            }
            if (tekstwaarde == null)
            {
                return new ValidationResult(false, "gelieve tekst in te vullen");
            }
            else
            {
                
                return ValidationResult.ValidResult;
               
            }

        }
    }
}
 
Laatst bewerkt:
misschien zoiets?

Code:
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
                return new ValidationResult(false, "string cannot be empty");

            if (value.ToString().Length > 50)
                return new ValidationResult(false, "string too long");

            return ValidationResult.ValidResult;
        }
 
nee werkt ook niet nu zegt hij de invoertekenreeks is onjuist en getallen wil hij wel invoeren
 
Klopt het in je xaml wel?

Heb zelf even getest bij dit en hier werkt het wel rode vlak komt gewoon er omheen als hij leeg is of te vol (met de code die ik hierboven had staan)
Code:
<TextBox>
    <TextBox.Text>
        <Binding Path="NameInput" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
            <Binding.ValidationRules>
                <converters:NameValidationRule ValidatesOnTargetUpdated="True" />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>


Wat je het beste kunt doen als je zoiets hebt als dit is een nieuw project met een window met alleen 1 textbox zodat je minimaal invloed hebt van andere dingen.

1 validation regel, 1 textbox en dan wat gaan testen.
 
ja idd bedankt mijn binding path stond nog op Bedrag en moest Naam zijn.
Kga nu wat oefenen om die binding onder de knie te krijgen

heel erg bedankt voor de grote hulp die ik gekregen heb
 
Ik heb nog 1 klein probleem denk dat het simpel op te lossen is maar voor het ogenblik zijn alle mogelijkheden dat ik kende hadden geen resultaat


het probleem is dus als ik het programma start dan kan ik de button dus gebruiken om taken toe te voegen in mijn lijst
ook al is de textbox leeg nu als ik iets type in die textbox en daarna de textbox weer leeg maak dan pas gaat de button disabele en geeft hij de foutmelding dat de textbox niet empty mag zijn deze fout heb ik bij alle 3 de textboxen en op alle 3 de textboxen zit er een foutopsporing dus nu is de vraag
hoe is het mogelijk dat ik die fouten op het begin krijg en dat die button ook disabele is op het begin


en het tweede probleem is dat ik een lange tekst in omschrijving typ dat het in die lijst in 1 lange zin komt en niet in lijnen dus ik dacht ja we lossen dit op met textwrapping niet dus want het werkt niet omdat het in window.resources staat die code denk ik want die name kan ik in C# niet opvragen

https://app.box.com/s/pajxb6j4j5k6xctr2lpt

dit is de solution die op mijn box staat
 
Laatst bewerkt:
ValidatesOnTargetUpdated op True property maakt het werkend?

Code:
<Binding.ValidationRules>
	<local:TekstValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>

En bij je listbox probeer eens je horizontale scrollbar uit te schakelen. (en textwrapping te gebruiken)
 
ja dit werkt hartelijk bedankt ik had de widh van die textblocken die in mijn listbox stonden aangepast naar 100 dit werkte ook maar het is idd veel beter als je de scrollbar uitzet
 
Prima.

Als je een vaste width zet zal het raar uitzien als je het venster groter maakt, en als je het kleiner maakt zul je denk ik hetzelfde probleem hebben.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan