WPF richtextbox detect changes
От: HotDog Швейцария www.denebspace.com
Дата: 06.06.16 12:32
Оценка:
Есть поле для редактирования текста (richtextbox) и кнопка с коммандой undo

        <StackPanel>
            <Button Command="{x:Static ApplicationCommands.Undo}"
                    CommandTarget="{Binding ElementName=Editor}"
                    Content="Undo"
                    HorizontalAlignment="Left"/>
            
            <RichTextBox x:Name="Editor" Width="300" Height="300" />
        </StackPanel>


Мне нужно узнать изменилось ли содержание richtextbox. Простейший свособ на мой взгляд это проверить IsEnabled у кнопки undo.
Во viewmodel обьявил

public bool IsDirty { get; set; }

и попытался повесить его на кнопку
        <StackPanel>
            <Button Command="{x:Static ApplicationCommands.Undo}"
                    CommandTarget="{Binding ElementName=Editor}"
                    Content="Undo"
                    HorizontalAlignment="Left"
                    IsEnabled="{Binding IsDirty, Mode=OneWayToSource}"/>
            
            <RichTextBox x:Name="Editor" Width="300" Height="300" />
        </StackPanel>

и не работает, сеттер у IsDirty никогда не вызывается.
Как нужно правильно это делать? Как узнать что содержимое richtextbox изменилось (textChanged event не подходит)
Re: WPF richtextbox detect changes
От: Mr.Delphist  
Дата: 06.06.16 16:31
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Во viewmodel обьявил


HD>
HD>public bool IsDirty { get; set; }
HD>


Реализует ли вьюмодель интерфейс INotifyPropertyChanged, явно или неявно?

Далее, кто устанавливает это свойство в True?
Re[2]: WPF richtextbox detect changes
От: HotDog Швейцария www.denebspace.com
Дата: 07.06.16 07:10
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Реализует ли вьюмодель интерфейс INotifyPropertyChanged, явно или неявно?


viewmodel реализует этот интерфейс (унаследована от NotificationObject, работаем с Prism). Но это роли не играет, т.к. мы хотим только получить состояние, а не меняем его сами.

MD>Далее, кто устанавливает это свойство в True?


В том то и дело, что я его его не устанавливаю. Кнопка енейблится/дизейблится из самого RichTextBox. Т.е. визуально все работает, а вот байндинг (IsEnabled="{Binding IsDirty, Mode=OneWayToSource}") в мой viewmodel не срабатывает.
Re[3]: WPF richtextbox detect changes
От: _Raz_  
Дата: 07.06.16 07:21
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>В том то и дело, что я его его не устанавливаю. Кнопка енейблится/дизейблится из самого RichTextBox. Т.е. визуально все работает, а вот байндинг (IsEnabled="{Binding IsDirty, Mode=OneWayToSource}") в мой viewmodel не срабатывает.


Биндитесь к команде
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[4]: WPF richtextbox detect changes
От: HotDog Швейцария www.denebspace.com
Дата: 07.06.16 07:30
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>Здравствуйте, HotDog, Вы писали:


HD>>В том то и дело, что я его его не устанавливаю. Кнопка енейблится/дизейблится из самого RichTextBox. Т.е. визуально все работает, а вот байндинг (IsEnabled="{Binding IsDirty, Mode=OneWayToSource}") в мой viewmodel не срабатывает.


_R_>Биндитесь к команде


А как это делается ?
Re[5]: WPF richtextbox detect changes
От: _Raz_  
Дата: 07.06.16 07:37
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>А как это делается ?


Во вью-модели: ApplicationCommands.Undo.CanExecuteChanged += UndoOnCanExecuteChanged или отсюда.
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Отредактировано 07.06.2016 7:39 _Raz_ . Предыдущая версия .
Re: WPF richtextbox detect changes
От: Sinatr Германия  
Дата: 07.06.16 07:48
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Как нужно правильно это делать? Как узнать что содержимое richtextbox изменилось (textChanged event не подходит)


Поправка, один раз вызывается.

Покопался немного, событие вызывается без проблем, странно почему не работает:

// xaml
IsEnabledChanged="Button_IsEnabledChanged"
// cs
void Button_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) => MessageBox.Show(e.NewValue.ToString());


У меня когда-то давно был похожий случай, смутно помню, пришел к выводу что биндинг к биндингу не работает.
---
ПроГLамеры объединяйтесь..
Re[2]: WPF richtextbox detect changes
От: HotDog Швейцария www.denebspace.com
Дата: 07.06.16 08:14
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Покопался немного, событие вызывается без проблем, странно почему не работает:


Да, это я уже тожел обнаружил, что в code behind все нормально прилетает. Пока сделал bahavior на это евент и прокидываю команду в viewmodel. Но не нравится мне это, костыль какой то.

S>У меня когда-то давно был похожий случай, смутно помню, пришел к выводу что биндинг к биндингу не работает.
Re[6]: WPF richtextbox detect changes
От: HotDog Швейцария www.denebspace.com
Дата: 07.06.16 08:20
Оценка:
Здравствуйте, _Raz_, Вы писали:

HD>>А как это делается ?


_R_>Во вью-модели: ApplicationCommands.Undo.CanExecuteChanged += UndoOnCanExecuteChanged или отсюда.


Из viewmodel не получится подписаться, так как мне нужно указать CommandTarget обьект, а я про него во viemodel ничего знаю.
За линк спасибо, гляну насколько оно хорошо работает.
Re[7]: WPF richtextbox detect changes
От: _Raz_  
Дата: 07.06.16 08:40
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Из viewmodel не получится подписаться, так как мне нужно указать CommandTarget обьект, а я про него во viemodel ничего знаю.


Имелось ввиду следующее:
    public class ViewModel
    {
        public ViewModel()
        {
            ApplicationCommands.Undo.CanExecuteChanged += UndoOnCanExecuteChanged;
        }

        private void UndoOnCanExecuteChanged(object sender, EventArgs eventArgs)
        {
            throw new NotImplementedException();
        }
    }
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[3]: WPF richtextbox detect changes
От: Mr.Delphist  
Дата: 07.06.16 16:11
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>В том то и дело, что я его его не устанавливаю. Кнопка енейблится/дизейблится из самого RichTextBox. Т.е. визуально все работает, а вот байндинг (IsEnabled="{Binding IsDirty, Mode=OneWayToSource}") в мой viewmodel не срабатывает.


А попробуйте биндиться не OneWayToSource, а двусторонне, и в любом случае явно задавая триггер: IsEnabled="{Binding IsDirty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.