Задать вопрос

Не работает Mode=OneWay в привязке к свойству объекта, в чём ошибка?

Написал класс для создания маски для TextBox
public class Class1
    {
        private string mask;
        public string Mask
        {
            get => mask;
            set
            {
                mask = value;
                MaskMethod();
            }
        }

        private int maxLenght = 12;
        public int MaxLenght
        {
            get => maxLenght;
            set
            {
                maxLenght = value;
            }
        }

        private void MaskMethod()
        {
            string s = Regex.Replace(Mask, @"[^0-9]", "");

            if (s.Length == 0)
            {
                mask = "";
            }
            else if (s.Length == 1)
            {
                mask = Regex.Replace(s, @"(\d{1})", "$1___-______");
            }
            else if (s.Length == 2)
            {
                mask = Regex.Replace(s, @"(\d{2})", "$1__-______");
            }
            else if (s.Length == 3)
            {
                mask = Regex.Replace(s, @"(\d{3})", "$1_-______");
            }
            else if (s.Length == 4)
            {
                mask = Regex.Replace(s, @"(\d{4})", "$1-______");
            }
            else if (s.Length == 5)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{1})", "$1-$2_____");
            }
            else if (s.Length == 6)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{2})", "$1-$2____");
            }
            else if (s.Length == 7)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{3})", "$1-$2___");
            }
            else if (s.Length == 8)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{4})", "$1-$2__");
            }
            else if (s.Length == 9)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{5})", "$1-$2_");
            }
            else if (s.Length == 10)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{6})", "$1-$2");
                maxLenght = 11;
            }
        }
    }

В конструкторе MainWindow указал объект данного класса в качестве DataContext для TextBox-а
public MainWindow()
        {
            InitializeComponent();
            Class1 cl = new Class1();
            textBox1.DataContext = cl;
        }


<TextBox 
                 Width="170" Canvas.Left="27" Canvas.Top="27"
                 Text="{Binding Mask, UpdateSourceTrigger=PropertyChanged}"
                 Name="textBox1"
                 MaxLength="{Binding MaxLenght, Mode=OneWay}"
                 Tag="____-______">
        </TextBox>


Однако когда маска заполняется полностью, то свойство MaxLenght не изменяется, согласно строке в классе Class1

else if (s.Length == 10)
            {
                mask = Regex.Replace(s, @"(\d{4})(\d{6})", "$1-$2");
                maxLenght = 11;
            }
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
OneWay тут ни при чем.
Вы забыли реализовать INotifyPropertyChanged.
Ваш TextBox просто не в курсе, что MaxLength поменялся.

Вот пример.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
OneWay это когда при изменении свойства меняется значение привязки, а не наоборот, вам нужно TwoWay или OneWayToSource.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы