[c#] Binding do kontrolek i nie tylko

Piszę sobie programik gdzie m.in. będzie prosty edytor tekstu czyli zwiększanie i zmiana rozmiaru czcionki itd.

Teraz jest to tak zrobione, że do textboxa mam podpięte combobox i slider w taki o to sposób:

FontFamily="{Binding ElementName=FontNameComboBox, Path=SelectedValue, Mode=OneWay}"

FontSize="{Binding ElementName=FontSizeSlider, Path=Value, Mode=OneWay}"

jednak działa to na cały tekst, a moim celem jest, aby działało to tylko na zaznaczonym tekście. Dopiero zaczynam się bawić z bindingami i moim pytaniem jest czy jest to możliwe? Drugim problemem jest to, aby w głównym oknie pokazała się nazwa użytkownika, którą uzyskuję w innym oknie. Klasa do tego dziedziczy po INotifyPropertyChanged.

public event PropertyChangedEventHandler PropertyChanged;


        protected void NotifyPropertyChanged(string propertyName)

        {

            if (PropertyChanged != null)

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }  



public string Login

        {

            get { return login; }

            set

            {

                login = value;

                NotifyPropertyChanged("Login");

            }

        }

W xamlu głównego okna daję

Text="{Binding Login, Mode=OneWay}"

,a może powinno to wyglądać inaczej.

Z góry dziękuję za wszelkie podpowiedzi.

  1. wydaje mi się, że będziesz musiał nadpisać OnRender, bo innej możliwości nie ma(możesz kombinować z SelectionBrush, ale to raczej nie od tego).

  2. nie INotifyPropertyChanged a Dependency properties *.

EDIT:

* - po przemyśleniu dochodzę do wniosku, że trochę się pospieszyłem z tą odpowiedzią. Implementacja INotifyPropertyChanged powinna wystarczyć, ale musisz pamiętać, by ustawić DataContext okna na drugie, które implementuje ten kawałek kodu, który podałeś.

Zrobiłem tak.

Do textboxa docelowego dałem

Text="{Binding SetLogin}"

W headClass mam wszystko od INotifyPropertyChanged oraz:

public string SetLogin

        {

            get { return login; }

            set

            {

                login = value;

                NotifyPropertyChanged("SetLogin");

            }

        }

Po zamknięciu tamtego okna wartość jest w SetLogin.

Jednak nadal nie wyświetla, ponadto nie wiem co robię źle.

Będę wdzięczny za podpowiedź.

Przy założeniu, że okno do pobierania loginu jest wyświetlane przez główne okno, można to zrobić tak:

LoginWnd.xaml :

LoginWnd.xaml.cs :

class LoginWnd : Window
{
private string login = string.Empty;
public string Login{ get {...} set {...} } //Tak jak to implementowałeś wyżej
public LoginWnd()
{
//...
this.DataContext = this;
}
//...
} [/code]


[b]MainWnd.xaml[/b] jest wręcz identyczny co [b]LoginWnd.xaml[/b], więc pominę.

[b]MainWnd.xaml.cs[/b]:

[code=php]//…private LoginWnd loginWnd = null;public MainWnd() {//…this.loginWnd = new LoginWnd();this.DataContext = this.loginWnd;// i dodatkowo gdzieś pokazanie LoginWnd} 

To NIE JEST sposób najlepszy. Najlepiej byłoby wydzielić login do osobnej klasy i to nią żonglować między _DataContext_ami, ale to już możesz sam zrobić. Ogólną zasadę działania znasz.