Two-way binding

1

Witam!

Mam takie szybkie pytanie. Jak zrealizować binding w obydwie strony? - tzn. zmieniam wartość jakiegoś pola w mojej klasie i automagicznie zmienia mi się zawartość np. textboxa (to jeszcze umiem, używając INotifyPropertyChanged ) ale też, jeżeli zmienię zawartość texboxa chciałbym, żeby wartość mojego pola również uległa zmianie, a to się nie dzieje. Nie satysfakcjonuje mnie event OnTextChanged, czy coś podobnego, bo musi być coś bardziej "profesjonalnego" (mam rację? :O).

Pozdrawiam, Wronq!

0

Hmm... Nie wiem, czy dokładnie przeczytałeś o tym co napisałem. W każdym razie nie znalazłem odpowiedzi na moje pytanie. Podałeś mi najprostszy przykład bindowania. W sumie się zastanawiam, czy takie bindowanie różni się czymś od zwykłego "textBox1.Text = student.Name;" ?
Ja natomiast chcę osiągnąć automatyzację w pewnym stopniu. Czyli np. gdzieś w programie dam sobie student.Name = "Stefan"; i automatycznie w textboxie pojawia mi się Stefan - to nauczyłem się realizować. Nurtuje mnie problem w drugą stronę - wpisuję w textboxie Czesław i automatycznie student.Name == "Czesław". Jaśniej troszkę? (chociaż sądzę, że poprzednie też było ok)

Pozdrawiam, Wronq!

0

Ja widzę tu tylko możliwość wykorzystania OnTextChange. Referencję do obiektu możesz wpisać w Tag danego textboxa. Zalecam jednak ostrożność, bo zmiana w textbox spowoduje uaktualnienie w obiekcie, co spowoduje uaktualnienie w textbox i tak w kółko. Możesz na przykład sprawdzać czy poprzednia wartość różni się od ustawianej.

0

Coś robisz źle. Ja binduje sobie textBoxa do zmiennej i wszystko działa w obie strony. Mode=TwoWay i zaimplementowane property changed i ustawione w bindowaniu że gdy property sie zmieni.

0

Twoja zmienna musi być publiczną właściwością.

0

@On: Mógłbyś pokazać kawałek kodu? Może faktycznie popełniam jakiś głupi błąd gdzieś...
@Krzyś: To jest oczywiste, inaczej ciężko byłoby zaimplementować OnPropertyChanged

Napisałem coś takiego:


textBox1.DataBindings.Add(new Binding("Text", this, "Text", false, DataSourceUpdateMode.OnValidation));
this.DataBindings.Add(new Binding("Text", textBox1, "Text", false, DataSourceUpdateMode.OnValidation));

private void button1_Click(object sender, EventArgs e)
{
    this.Text = "Blah";
}

private void button2_Click(object sender, EventArgs e)
{
    this.textBox1.Text = "Blah2";
}

To faktycznie działa i nie jest najgorzej... Tylko powstaje nowe pytanie - jak mogę zbindować coś do swojej klasy (np. student.DataBindings = ...) i czy wtedy również to zadziała?

0

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Name="myWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="40" Width="200" Text="{Binding ElementName=myWindow, Path=MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged" >

        </TextBox>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="166,218,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

MainWindow.xaml.cs

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private string myProperty;
        public string MyProperty
        {
            get { return this.myProperty; }
            set
            {
                this.myProperty = value;
                OnPropertyChanged("MyProperty");
            }
        }
        public MainWindow()
        {
            InitializeComponent();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            MessageBox.Show(MyProperty);
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MyProperty = "asd";
        }
    }
}
0

Czy istnieje możliwość użycia XAMLa bez WPF? Ja pracuję pod WinFormsami i... no nie wiem czy się da tak zrobić.

0

XAML bez WPF raczej nie, choć nie wiem, nie znam się. Nie zauważyłem że robisz WinForms, sory. Chyba pozostaje czekać na specialiste od Formsów, lub przerzucić się na WPF bo Formsy odchodzą do lamusa ;).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0