Nieaktywny przycisk- WPF

Nieaktywny przycisk- WPF
zeed94
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
0

Witam!
Chciałem napisać program, który sprawdza poprawność podanego numeru PESEL, a następnie wyświetla przy pomocy XAML dane, które udało się uzyskać z niego. Na pierwszy ogień chciałem żeby wyświetlił Rok z podanego numeru, jednakże nie mogę tego sprawdzić ponieważ przycisk jest nie aktywny, dlatego też spójrzcie na ten kod i powiedzcie (lub podpowiedzcie) co robię źle.

Ten program pisałem przy użyciu wzroca MVVM.

Model:

Kopiuj
class Data
    {
        public int Year { get; set; }
        public int Month { get; set; }
        public int Day { get; set; }
        public string Sex { get; set; }
        public int ControlNumber { get; set; }

        public void UpdateProperties(string _string)
        {
            if (_string.Length == 11)
            {
                Decoding dekoder = new Decoding();

                this.Year = dekoder.Year(_string);
                this.Month = dekoder.Month(_string);
                this.Day = dekoder.Day(_string);
                this.Sex = dekoder.Sex(_string);
                this.ControlNumber = dekoder.ControlNumber(_string);
            }
        }

        public bool WhetherYearIsCorrect()
        {
            return Year < 1900 ? false : true;
        }

        public bool WhetherControlNumerIsCorrect(string _string)
        {
            if (_string.Length == 11)
            {
                int sum = 0, controlNumber = 0;

                for (int i = 0; i < _string.Length - 1; i++)
                {
                    if (i == 0 || i == 4 || i == 8) sum += int.Parse(_string[i].ToString()) * 1;
                    if (i == 1 || i == 5 || i == 9) sum += int.Parse(_string[i].ToString()) * 3;
                    if (i == 2 || i == 6) sum += int.Parse(_string[i].ToString()) * 7;
                    if (i == 3 || i == 7) sum += int.Parse(_string[i].ToString()) * 9;
                }

                controlNumber = 10 - (sum % 10);

                return this.ControlNumber == controlNumber ? true : false;
            }
            return false;
        }

        public bool WhetherMonthIsCorrect()
        {
            return Month > 0 && Month < 13 ? true : false;
        }

        public bool WhetherDayIsCorrect()
        {
            switch (Month)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    if (Day > 0 && Day < 31) return true;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    if (Day > 0 && Day < 30) return true;
                    break;
                case 2:
                    if (Day > 0 && Day < 29) return true;
                    break;
            }

            return false;
        }

        public bool WhetherDataIsCorrect(string _string)
        {
            UpdateProperties(_string);
            return WhetherYearIsCorrect() && WhetherControlNumerIsCorrect(_string) && WhetherMonthIsCorrect() && WhetherDayIsCorrect();
        }
    }

Model Widoku:

Kopiuj
    class ViewModel : INotifyPropertyChanged
    {
        public Data data = new Data();

        public int Year
        {
            get
            {
                return data.Year;
            }
        }
        public int Month
        {
            get
            {
                return data.Month;
            }
        }
        public int Day
        {
            get
            {
                return data.Day;
            }
        }
        public string Sex
        {
            get
            {
                return data.Sex;
            }
        }
        public int ControlNumber
        {
            get
            {
                return data.ControlNumber;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

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

        public bool WhetherStringIsCorrect(string _string)
        {
            if (string.IsNullOrWhiteSpace(_string)) return false;
            if (_string.Length != 11) return false;
            int liczba;
            if (!int.TryParse(_string, out liczba)) return false;
            else return data.WhetherDataIsCorrect(_string);
        }

        private ICommand changeCommand;

        public void Change(object argument)
        {
            string _string = argument.ToString();
            if (WhetherStringIsCorrect(_string))
            {
                data.UpdateProperties(_string);

                OnPropertyChanged("Year");
                OnPropertyChanged("Month");
                OnPropertyChanged("Day");
                OnPropertyChanged("Sex");
                OnPropertyChanged("ControlNumber");
            }
        }

        public ICommand ChangeCommand
        {
            get
            {
                if (changeCommand == null)
                {
                    changeCommand = new RelayCommand(
                        (object argument) =>
                        {
                            try
                            {
                                Change(argument);
                            }
                            catch (Exception exc)
                            {
                                MessageBox.Show(exc.Message, "PESEL", MessageBoxButton.OK, MessageBoxImage.Error);
                            }
                        },
                        (object argument) =>
                        {
                            return WhetherStringIsCorrect((string)argument);
                        }
                        );
                }
                return changeCommand;
            }
        }
    }
Kopiuj

Kopiuj
  class RelayCommand : ICommand
    {
        #region Fields

        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;

        #endregion

        #region Constructor

        public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)
        {
            if (execute == null) throw new ArgumentNullException("execute");
            _execute = execute;
            _canExecute = canExecute;
        }

        #endregion

        #region ICommand Members

        //Metoda CanExecute sprawdza czy wykonianie polecenia jest możliwe
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (_canExecute != null) CommandManager.RequerySuggested += value;
            }
            remove
            {
                if (_canExecute != null) CommandManager.RequerySuggested -= value;
            }
        }

        //Metoda Execute wykonuje zasadnicze polecenie
        public void Execute(object parameter)
        {
            _execute(parameter);
        }

        #endregion
    }

Konwerter:

Kopiuj
public class BoolToBrushConverter : IValueConverter
    {
        public Brush ColorTrue { get; set; }
        public Brush ColorFalse { get; set; }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool b = (bool)value;
            return b ? ColorTrue : ColorFalse;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Widok:

Kopiuj
<Window x:Class="PESEL.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        
        xmlns:Model="clr-namespace:PESEL.Model"
        xmlns:ViewModel="clr-namespace:PESEL.ViewModel"
        xmlns:Converter="clr-namespace:PESEL.Converters"
       
        
        Title="PESEL (c) 2015" Height="300" Width="300" ResizeMode="NoResize">
    
    <Window.Resources>
        <Converter:BoolToBrushConverter x:Key="boolToBrush" KolorFalse="Red" KolorTrue="Black"/>
    </Window.Resources>
    
    <Window.DataContext>
        <ViewModel:ViewModel />
    </Window.DataContext>
    
    <StackPanel>
        <!--Wyświetlane po uruchomieniu programu!-->
        <StackPanel Height="42" Orientation="Horizontal" Margin="10">

            <TextBlock Margin="10" Width="110" FontSize="16" Text="Podaj PESEL:"  />

            <TextBox Width="120" Margin="10" TextAlignment="Center" FontSize="14" MaxLength="11"
                     Foreground="{Binding ElementName=Walidacja, Path=IsEnabled, Mode=OneWay, Converter={StaticResource boolToBrush}}" />
        </StackPanel>

        <Button x:Name="Walidacja" Content="SPRAWDŹ" Margin="100,10,100,10"
                Command="{Binding ZmieńCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=Rok, Path=Text}"/>
        
        <StackPanel Margin="10">
            <!--ROK URODZENIA-->
            <StackPanel Height="35" Orientation="Horizontal" Margin="10,0">

                <TextBlock Margin="10" Width="110" Height="20"
                       TextWrapping="Wrap" Text="Rok Urodzenia:" />

                <TextBlock x:Name="Rok" Margin="10" Width="80" Height="20" Text="{Binding Rok, Mode=OneWay}"/>

            </StackPanel>
        </StackPanel>
    </StackPanel>
</Window>
edytowany 1x, ostatnio: zeed94
dam1an
Jezusie polskie ogonki w kodzie...
zeed94
Tak, tak wiem. Musze się pozbyć tego brzydkiego przyzwyczajenia -_-
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 17 godzin
0
Kopiuj
this.Rok = dekoder.Rok(łańcuch);
this.Miesiąc = dekoder.Miesiąc(łańcuch);
this.Dzień = dekoder.Dzień(łańcuch);
this.Płeć = dekoder.Płeć(łańcuch);
this.Kontrolna = dekoder.Kontrolna(łańcuch);

Wyobraź sobie, że dają ci w pracy coś takiego:

Kopiuj
this.年 = デコーダ.年(文字列);
this.月 = デコーダ.月(文字列);
this.日 = デコーダ.日(文字列);
this.性 = デコーダ.性(文字列);
this.チェック = デコーダ.チェック(文字列);
edytowany 1x, ostatnio: Azarien
Hrypa
pracowałem kiedyś na takim kodzie:D
Ktos
Ja kiedyś zdekompilowałem program, a tu takie krzaczki ;-)
dam1an
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
  • Postów:1589
0

Musisz odpalić event CanExecutChanged.

Wydaje mi się, że odpalam ten event wraz z wywołaniem konstruktora RelayCommand.

Źle Ci się wydaje. Program nie wie o tym kiedy zmienił się widok.
Wywołuj:

Kopiuj
CommandManager.InvalidateRequerySuggested();

Kiedy zmieniasz coś w widoku.

Ps: @zeed94 W komentarzach dyskutuje się na tematy poboczne.

edytowany 1x, ostatnio: dam1an
zeed94
Wydaje mi się, że odpalam ten event wraz z wywołaniem konstruktora RelayCommand.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)