Проблема INotifyPropertyChanged

Легко сделать с помощью функции почтового индекса в списке.

val v1 = "a,c,e,g,i,k"
val v2 = "b,d,f,h,j,l"

val list1 = v1.split(",").toList
val list2 = v2.split(",").toList

list1.zip(list2).mkString(",") // res0: String = (a,b),( c,d),( e,f),( g,h),( i,j),( k,l)
7
задан Bill the Lizard 28 August 2011 в 03:18
поделиться

6 ответов

Событие PropertyChanged проигнорировано TextBox, потому что это - инициатор события.

Некоторое разъяснение:

TextBox (или привязка на текстовом поле) знает, что это - инициатор, потому что это получает событие PropertyChanged в том же вызове. Выполнением асинхронного вызова текстовым полем (или привязкой) не имеют никакого способа знать, что это - инициатор, таким образом, это обработает событие, как будто кто-то еще обновил его

Если Вы добавите 2-е текстовое поле к своему UI, то Вы будете видеть, что 2-й TextBox действительно изменяется при редактировании 1-го, и наоборот.

9
ответ дан 6 December 2019 в 14:10
поделиться

Причина состоит в том, потому что у Вас есть hardcoded 'Некоторое Имя' в методе set. То, когда Вы изменили значение текстового поля, метод set на самом деле становится названным и оно снова установка "Some Name" как propertyValue, таким образом, оно не делает, кажется, изменяется в UI. Поместить _name = value и вещи будут просто работать, как Вы ожидали,

0
ответ дан 6 December 2019 в 14:10
поделиться

Замена метода set в форме

        set 
        {
            _name = "Some Name";
            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.DataBind, 
                (SendOrPostCallback)delegate { OnPropertyChanged("Name"); },
                null);
        }

решает вопрос, но это все еще открыто. Почему я должен выполнить асинхронный вызов вместо синхронной передачи сигналов, что мое свойство было изменено.

0
ответ дан 6 December 2019 в 14:10
поделиться

Если я не ошибаюсь, значение по умолчанию, обязательным поведением текстового свойства на TextBox является TwoWay, таким образом, это должно работать. Можно вынудить это быть TwoWay в XAML как это:

<Window Title="Window1" Height="300" Width="300">
  <Grid>
    <StackPanel>
        <TextBox Text="{Binding Name, Mode=TwoWay}" Margin="10"/>
        <Button HorizontalAlignment="Center" 
        Content="Click Me" Margin="5" 
        Padding="2" Click="OnButtonClick" />
    </StackPanel>
  </Grid>
</Window>

Отметьте Mode=TwoWay в Обязательном объявлении.

Если это не работает, то я подозреваю, что исключение выдается в коде, который запускает событие или присваивает свойство, и необходимо искать это.


Кажется, существует возможность, что Вы выполняете вызов для изменения значения на потоке, который не является потоком UI. Если это верно, затем или необходимо упорядочить вызов для увольнения, свойство изменило событие на потоке UI, или внесите изменение в значение на потоке UI.

Когда объект связывается с элементом UI, изменения в объекте, который может влиять на UI, должны быть внесены на потоке UI.

0
ответ дан 6 December 2019 в 14:10
поделиться
public string MyField  
{  
    get { return _myField; }  
    set {   
        if (_myField == value)  
            return;  

        _myField = value;   

        OnPropertyChanged("MyField");  
    }  
}  

Это - надлежащая реализация свойства.

При изменении свойства удостоверьтесь, что тот же самый экземпляр объекта связывается с управлением. Иначе изменение будет уведомлено, но управление никогда не будет получать его, потому что управление не связывается правильно.

0
ответ дан 6 December 2019 в 14:10
поделиться

Как уже указывалось в Bubblewrap, это сделано намеренно - текстовое поле предполагает, что если оно устанавливает для связанного свойства какое-то значение, установщик не изменит это значение. Согласно Microsoft , они не изменят это поведение, поскольку это нарушит существующий код.

Если вы хотите, чтобы изменил значение (да, для этого есть вполне веские причины that), вы должны использовать обходной путь, например, добавив фиктивный конвертер. Существует запись в блоге (написанная не мной), в которой подробно описывается этот метод.

2
ответ дан 6 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

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