powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / wpf binding innerxml
13 сообщений из 13, страница 1 из 1
wpf binding innerxml
    #37889342
ornitopter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, гуру WPF!
Вводная:
есть такой вот
Код: plaintext
xml:
Код: xml
1.
2.
3.
4.
5.
		<item font="Times New Roman,10,1,0,0,0" left="40" top="44" right="182" bottom="48" align="0" border="0">
			<txt xpath="@ф"> </txt>
			<txt xpath="@и"> </txt>
			<txt xpath="@о"> </txt>
		</item>



вот такой
Код: plaintext
TextBlock:
Код: xml
1.
<TextBlock Text="{Binding Path=InnerXml, Converter={StaticResource stringConverter}}">



и вот такой
Код: plaintext
stringConverter:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string strVal = "<a>"+(string)value+"</a>";
            XmlDocument xDoc = new XmlDocument();
            xDoc.LoadXml(strVal);

            string s = String.Empty;
            foreach (XmlElement xL in xDoc.DocumentElement.SelectNodes("txt"))
                s = s + xL.InnerText + xL.GetAttribute("xpath");

            string res = s.Replace("+br+", "\r\n");
            return res;
        }



В общем-то все в TextBlock отображается так, как надо, но только на момент загрузки. В дальнейшем, если изменить что-нибудь в узлах txt, приведенного выше xml, то изменения никак не отображаются в TextBlock.

Подскажите, в каком направлении копать, дабы решить сию проблему?
Заранее спасибо.

...and the Hades came close behind him... (Revelations 6:8)
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37889562
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это делали после изменений UpdateLayout();
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37890041
ornitopter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да пробовал. не помогает. расположение и размеры текстблока не меняются же )
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37891727
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ornitopter,

Я конечно все понимаю - но может быть проблема в банальном Mode=TwoWay?
Я просто в привязке не увидел этот параметр (хотя по идее долже по умолчанию идти).
Поставь его в Binding и отпишись по изменениям
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37891734
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ornitopter,

Мало того - ты должен помнить про параметр TriggerUpdateSource (вроде бы так называется).
Короче смысл в том, что по умолчанию при изменениях в TextBox изменения в другие контролы передадутся, если ты уберешь фокус с текстбокса (в котором делал изменения) - то толко после этого изенения появятся.
Как вариант - измени этот параметр на PropertyChanged.
А вообще, надо бы конечно читать про Bindning прежде чем тут писать.
Тут по возможности помогают как правило тогда - когда ты сделал все согласно мануалу а у тебя косяк какой-то.
А когда из поста видно, что чел откровенно поленился почитать про Binding и начинает спрашивать сколько будет 2 + 2 ни у кого не будет желания помогать.
А вот если будет вопрос - почему я складываю 2 + 2 а у меня получается 5 - вот в этом случае тут с удовольствием помогут
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37893623
ornitopter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
unknownfromrusА когда из поста видно, что чел откровенно поленился почитать про Binding и начинает спрашивать сколько будет 2 + 2 ни у кого не будет желания помогать.


ТС, конечно же, ленив и про биндинг не читал. И это зло. А вся суть зла состоит в том, что речь идет не о TextBox, а о TextBlock, в котором мне Mode = TwoWay для биндинга совсем не нужен. Но это все лирика.

Кроме того, редактирование узлов txt происходит в гриде:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
            <DataGrid x:Name="txtGrid"
                      DataContext="{Binding ElementName=tvwNodes, Path=SelectedItem}"
                      ItemsSource="{Binding XPath=txt, Mode=TwoWay}"
                      AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="xpath" Binding="{Binding XPath=@xpath, Path=Value, Mode=TwoWay}" Width="40" CanUserReorder="False" />
                    <DataGridTextColumn Header="&lt;текст&gt;" Binding="{Binding Path=InnerText, Mode=TwoWay}" Width="1*" CanUserReorder="False" />
                </DataGrid.Columns>
            </DataGrid>
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37893631
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ornitopter,

Чтобы биндинг мог "подхватить" изменение со стороны целевого свойства объекта данных, нужно чтобы объект данных реализовал INotifyPropertyChanged и поднимал событие PropertyChanged с аргументом в виде строки с названием целевого свойства объекта данных при изменении этого свойства.
Короче говоря, вам нужно реализовать INotifyPropertyChanged.
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37893644
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ornitopter,

Ты наверно не услшыл того, что я написал.
Суть такова - что в источнике измененных данных (тексбокс или ячейка грида - по сути тот же текстбокс) ты изменяешь контент (текст), то изменения передадуться тогда, когда с вводимого поля ты уберешь фокус.
Но ты можешь это побороть - изменив параметр TriggerUpdateSource - это свойство биндинга.
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37894469
ornitopter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
unknownfromrusСуть такова - что в источнике измененных данных (тексбокс или ячейка грида - по сути тот же текстбокс) ты изменяешь контент (текст), то изменения передадуться тогда, когда с вводимого поля ты уберешь фокус.


Это я и сам знаю.
Все прекрасно работает, если через текстбокс менять какой-нибудь атрибут в xml (например, font, то шрифт в текстблоке изменится сразу, как только фокус уйдет из текстбокса), а вот если работать с InnerXml, OuterXml, InnerText, то ничего не обновляется, хоть умри.
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37894486
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ornitopter,

Не понимаю тебя.
То есть атрибуты XML изменяются так? А внутренние узлы (если их изменять) - не изменяются так?
Давай код - не охота руками что-то с нуля под твой пример набирать. Я гляну че и как. А то с твоих слов какая то ерунда получается
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37895332
ornitopter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
unknownfromrusНе понимаю тебя.
То есть атрибуты XML изменяются так? А внутренние узлы (если их изменять) - не изменяются так?


Как раз правильно понимаешь. :) Именно так все и происходит.
Код подготовлю, выложу.
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37895375
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ornitopter,

Ок, выкладывай - я гляну.
По крайней мере меня зацепила твоя проблема))
Эта проблема из разряда - че за хрень))) Такие вещи интересно решать))
...
Рейтинг: 0 / 0
wpf binding innerxml
    #37936633
ornitopter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос снят )
Код: xml
1.
<TextBlock Text="{Binding XPath=., Path=InnerXml, Converter={StaticResource stringConverter}}">


Вот, работает так, как надо )
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / wpf binding innerxml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]