Laden...

Xaml-Binding Properties zur Laufzeit aktualisieren

Erstellt von kkirchhoff vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.907 Views
K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren
Xaml-Binding Properties zur Laufzeit aktualisieren

Ich habe folgendes Problem, ich habe auf ein Formular mit verschiednen Eingabe-Elementen sowie zwie Buttons. Ich möchte in der XAML-Code das Property "IsEnable" verwenden Und in Abhängigkeit der Anwendungsverlaufes jeweils den Wert True bzw. False zuweisen. Wie muss ich das Binding auf das Property vornehmen.

Ich habe schon folgenen Code verwendet, der auch funktioniert. Nur wie spreche ich die Properties im XAML-Code von meiner Anwendung aus an, damit diese dan auch aktualisiert werden.

link zum Clock Beispiel:
http://blogs.ppedv.de/bernhardg/archive/DataBinding-in-WPFSilverlight-ndash-Refresh-ohne-Code-im-UI---INotifyPropertyChanged

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

Nur wie spreche ich die Properties im XAML-Code von meiner Anwendung aus an, damit diese dan auch aktualisiert werden.

Umgekehrt wird nen Schuh draus. In XAML bindest du das IsEnabled Property gegen ein entsprechendes Property in deiner Datenklasse mit der du arbeitest. Und diese Properties kannst du ja beliebig setzen in deiner Verarbeitungslogik. So bekommt man keine starre Kopplung zwischen GUI und Daten. Mit INotifyPropertyChanged liegst du vollkommen richtig, weil von irgendwoher muss die GUI ja wissen das sich was geändert hat. Das Beispiel aus dem Link ist aber eher ungewöhnlich. In der Regel wird PropertyChanged direkt im set des Propertys aufgerufen. Hier klappt es nur so schön im Timer Tick weils um die Uhrzeit geht.

Baka wa shinanakya naoranai.

Mein XING Profil.

K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren

Hallo Talla,
danke Dir erstmal für Deine Antwort! Ich habe jetzt versucht, das nach Deiner Erklärung umzusetzen nur leider wird das GUI nicht upgedated.

Hier mal mein Code (Auszug)


   public class UserRegistration : INotifyPropertyChanged
    {
       public event PropertyChangedEventHandler PropertyChanged;


        private RegistrierungDialog registrierungDialog;
        private UserManager appUM;
        private Boolean _isEditEnabled;


        public  UserRegistration()
        {
            appUM = UserManager.GetInstance();
            PropertyChanged +=new PropertyChangedEventHandler(UserRegistration_PropertyChanged);
        }



        public void RegistrierungFreiberufler()
        {
            showRegistrierung("Als Freiberufler Registrieren", Settings.typBenutzer.Freiberufler);
        }

        void showRegistrierung(string _dlgTitel, Settings.typBenutzer _typBenutzer)
        {
            registrierungDialog = new RegistrierungDialog();
            registrierungDialog.Loaded += new RoutedEventHandler(registrierungDialog_Loaded);
            registrierungDialog.Closed += new EventHandler(registrierungDialog_Closed);
            registrierungDialog.HasCloseButton = false;
            registrierungDialog.TypBeutzer = _typBenutzer;
            registrierungDialog.Title = _dlgTitel;
            registrierungDialog.btnCheckNewEMailAdresse.Click += new ImageButton.dlDoButtonClick(btnCheckNewEMailAdresse_Click);
            registrierungDialog.Show();
        }

        void btnCheckNewEMailAdresse_Click(object sender, MouseEventArgs e)
        {

            if (registrierungDialog.edtCheckEMailAdresse.Text == registrierungDialog.edtEMailAdresse.Text)
            {
                jobbotsWPServiceReference.jobbotsWPServiceClient _sc = DataHelper.GetWPServiceClient();
                _sc.CheckNewEMailAdressCompleted += new EventHandler<jobbotsWPServiceReference.CheckNewEMailAdressCompletedEventArgs>(_sc_CheckNewEMailAdressCompleted);
                _sc.CheckNewEMailAdressAsync(registrierungDialog.edtCheckEMailAdresse.Text);
            }
            else
            {
                MessageBox.Show("EMail-Adressen stimmen nicht überein!");
            }

        }

        void _sc_CheckNewEMailAdressCompleted(object sender, jobbotsWPServiceReference.CheckNewEMailAdressCompletedEventArgs e)
        {
            registrierungDialog.updateGui(e.Result);
            IsEditEnabled = e.Result;
        }

        void UserRegistration_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            MessageBox.Show("hier wird der Event gefeuert");
        }

        void registrierungDialog_Closed(object sender, EventArgs e)
        {
            //  throw new NotImplementedException();
        }

        void registrierungDialog_Loaded(object sender, RoutedEventArgs e)
        {
            registrierungDialog.updateGui(false);
            IsEditEnabled = false;
        }



        public Boolean IsEditEnabled
        {

            get
            {
                return this._isEditEnabled;
            }
            set
            {
                this._isEditEnabled = value;
                if (this.PropertyChanged != null)
                    this.PropertyChanged(this, new PropertyChangedEventArgs("IsEditEnabled"));
            }
        }

    }


hier der Teis aud dem XAML (Auszug)


	<sdk:ChildWindow.Resources>
        <mytools:UserRegistration x:Key="EditStatus" />
	</sdk:ChildWindow.Resources>


        <Button x:Name="OKButton"  
                IsEnabled="{Binding Path=IsEditEnabled,Source={StaticResource EditStatus}}"
                Content="OK" 
                Click="OKButton_Click" 
                Width="75" Height="23" 
                HorizontalAlignment="Right" 
                Margin="0,12,79,0" 
                Grid.Row="3" 
                Grid.Column="2" 
                Foreground="#FF2A3A57" />

            <dxe:TextEdit Name="edtName1" 
                          IsEnabled="{Binding Path=IsEditEnabled, Source={StaticResource EditStatus}}" 
                          Width="300" Margin="0,5,0,0" 
                          HorizontalAlignment="Left" />



In Abhängigkeit des Properties IsEditEnabled soll der Button aktiv bzw. inaktiv sein sowie eben auch der Objekt TextEdit.

Ich weiss einfach nicht was noch fehlt oder was ich falsch mache ...

Danke

1.378 Beiträge seit 2006
vor 13 Jahren

Mit

    <sdk:ChildWindow.Resources>
        <mytools:UserRegistration x:Key="EditStatus" />
    </sdk:ChildWindow.Resources>

erstellst du eine neue Instanz deiner Klasse, was du bestimmt nicht willst. Irgendwo hast du ja bereits eine Instanz und die muss als DataContext deiner View gesetzt werden.
Nur dann kann die View auch auf die Änderungen deines ViewModels reagieren.


UserRegistration userRegistration = new UserRegistration();

MyView view = new MyView();

view.DataContext=userRegistration;

Lg XXX

K
kkirchhoff Themenstarter:in
118 Beiträge seit 2008
vor 13 Jahren

Es funktioniert, Danke Euch 😃