Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Binding: изменение объектов не обрабатывается байднигом / 10 сообщений из 10, страница 1 из 1
17.07.2009, 13:35
    #36095547
McCar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
Джентельмены, я к WPF ной теме обращаюсь эпизодически, поэтому отнеситесь снисходительно если задаю глупый вопрос. Объясните плиз почему не срабатывает байндинг на примере следующего кода..
using System;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using Xunit;
namespace Maria.Common.WPF.xUnit
{
public class UpdateDataTest
{
/// <summary>
/// Тест показывающий что изменение объектов не обрабатывается байднигом
/// </summary>
[Fact ]//(Skip = "Обламывается пока ")
public void UpdateData()
{
var tb = new TextBox();
var test2 = new Test2();
var b = new Binding
{
Mode = BindingMode.OneWay,
// , Path = new PropertyPath("Name")
Converter = new TestConverter()
};

tb.SetBinding(TextBox.TextProperty, b);
test2.Name = "Name";
Assert.True(tb.Text == test2.Name);
}
class Test2 : INotifyPropertyChanged
{
private string _Name;
public string Name
{
get { return _Name ;}
set
{
_Name = value;
OnPropertyChanged("Name"); } }

public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
class TestConverter : IValueConverter
{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((Test2)value).Name;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
}
}

---------
То есть свойство Name при изменении не отражается в забайнденном тексбоксе.
Я так понял что проблема в том что у события OnPropertyChanged нет обработчика.. В какой момент он должен назначаться? В общем в чем косяк?
...
Рейтинг: 0 / 0
17.07.2009, 14:24
    #36095718
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
Mode = BindingMode.TwoWay
...
Рейтинг: 0 / 0
17.07.2009, 15:06
    #36095843
McCar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
SeVaMode = BindingMode.TwoWay
С конвертором ругается что " : Two-way binding requires Path or XPath." С Path просто как и раньше не срабатывает..
И.. при чем тут TwoWay. я так понимаю что OneWay это от объекта к текстбоксу поэтому вроде и так должно сработать.
...
Рейтинг: 0 / 0
17.07.2009, 16:00
    #36096014
McCar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
Да, еще забыл
tb.DataContext = test2;
прописать.
Но, если его (DataContext) указать, то когда в для binding прописываеь Path - все отрабатывает нормально, у PropertyChanged есть обработчики. А если через IValueConverter -тогда по прежнему нет.
...
Рейтинг: 0 / 0
17.07.2009, 16:36
    #36096112
musson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
McCar

попробуй не кодом, а разметкой забиндить
...
Рейтинг: 0 / 0
17.07.2009, 16:42
    #36096126
McCar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
mussonMcCar

попробуй не кодом, а разметкой забиндить
да там на самом деле более сложный случай который я попытался свести к коротенькому тесту чтобы кто нибудь вразумил меня по поводу механизма байдинга через IValueConverter.
...
Рейтинг: 0 / 0
17.07.2009, 16:43
    #36096128
musson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
в студии в окне Output можно посмотреть ошибку, если она есть
...
Рейтинг: 0 / 0
17.07.2009, 19:23
    #36096455
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
McCarДа, еще забыл
tb.DataContext = test2;
прописать.
Но, если его (DataContext) указать, то когда в для binding прописываеь Path - все отрабатывает нормально, у PropertyChanged есть обработчики. А если через IValueConverter -тогда по прежнему нет.

1. Без указания контекста свойство к чему привязываться будет? Контекст по любому надо указать.
2. Если указан Path="Name", то свойство TextProperty привязывается к интерфейсу INotifyPropertyChanged и ждет сообщений с e.propertyName == "Name".
3. Если Path не указывается, то свойство привязывается к объекту test2... Тяжелый случай То есть, отрабатывать привязка, теоретически, будет при отправке сообщения об изменении test2... А так как объект test2 у вас:
а) не меняется,
б) ни кто не отправляет сообщений об его изменении,
то, соответственно, обновления интерфейса и не происходит.

Надеюсь, понятно изложил :)
...
Рейтинг: 0 / 0
18.07.2009, 15:31
    #36096885
McCar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
Roman S. GolubinMcCarДа, еще забыл
tb.DataContext = test2;
прописать.
Но, если его (DataContext) указать, то когда в для binding прописываеь Path - все отрабатывает нормально, у PropertyChanged есть обработчики. А если через IValueConverter -тогда по прежнему нет.

1. Без указания контекста свойство к чему привязываться будет? Контекст по любому надо указать.
2. Если указан Path="Name", то свойство TextProperty привязывается к интерфейсу INotifyPropertyChanged и ждет сообщений с e.propertyName == "Name".
3. Если Path не указывается, то свойство привязывается к объекту test2... Тяжелый случай То есть, отрабатывать привязка, теоретически, будет при отправке сообщения об изменении test2... А так как объект test2 у вас:
а) не меняется,
б) ни кто не отправляет сообщений об его изменении,
то, соответственно, обновления интерфейса и не происходит.

Надеюсь, понятно изложил :)
Ну с датаконтекстом это я просто недокопипастил.
А насчет остального.. Кажется начинает доходить. Я видимо выдавал желаемое за действительное когда считал что задать Converter это тоже самое что задать Path - но в другой форме. Похоже на то что байдинг не отслеживает никакие изменения объекта до тех пор пока не задашь в явном виде Path. Причем если задать одновременно и то и то
(
var b = new Binding
{
Mode = BindingMode.OneWay,
Converter = new TestConverter(),
Path = new PropertyPath("Name")
};
)
-обработчики события PropertyChanged подключаются, но уже в этих обработичках на изменненное свойство Name накладывается конвертор, которое естесвенно не может скастить string в тестовый класс.
Если задать пустой PropertyPath("") - обработчики молча не подключаются,
если несущесвующий PropertyPath("aaaa") - тогда в Output окно выводится ошибка байдинга и обработчики не подключаются..
То есть - я так понял, если мы задаем конвертор и не задаем Path, - мы не можем воспользоватсья OneWay или TwoWay байдингом? то есть нет никакого способа заставить байдинг подключать обработчики для PropertyChanged кроме как указав Path?
У меня не просто теоретический вопрос, дело в том что в существующем проекте байдинг сделан через IConvertor ы, и сейчас встала задача обновления интерефейса одновременно с изменениями объектов к этому интерфейсу привязанных.
...
Рейтинг: 0 / 0
10.01.2010, 23:46
    #36402742
eLVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Binding: изменение объектов не обрабатывается байднигом
Здравствуйте.
Столкнулся с аналогичной проблемой. Поиск решения привел в эту ветку.

Roman S. Golubin
1. Без указания контекста свойство к чему привязываться будет? Контекст по любому надо указать.
2. Если указан Path="Name", то свойство TextProperty привязывается к интерфейсу INotifyPropertyChanged и ждет сообщений с e.propertyName == "Name".
3. Если Path не указывается, то свойство привязывается к объекту test2... Тяжелый случай То есть, отрабатывать привязка, теоретически, будет при отправке сообщения об изменении test2... А так как объект test2 у вас:
а) не меняется,
б) ни кто не отправляет сообщений об его изменении,
то, соответственно, обновления интерфейса и не происходит.

Надеюсь, понятно изложил :)

Да, видимо у нас с автором топика тяжелый случай №3.
Данный пост навел на следующую мысль - нужно создать класс-обертку и использовать его экземпляр в качестве DataContext.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
    // Исходный класс.
    public class FlyProject: INotifyPropertyChanged
    {

        bool _isPolygonMode = false;

        public bool IsPolygonMode
        {
            get { return _isPolygonMode; }
            set 
            {
                if (value != _isPolygonMode)
                {
                    _isPolygonMode = value;
                    NotifyPropertyChanged("IsPolygonMode");
                }
            }
        }

        int _bp = 0;

        public int Bp
        {
            get { return _bp; }
            set
            {
                _bp = value;
                this.NotifyPropertyChanged("Bp");
            }
        }

        List<Point> _pathPoints = new List<Point>();

        public List<Point> PathPoints
        {
            get { return _pathPoints; }
        }

        public FlyProject()
        {
            // набор точек для примера.
            _pathPoints.Add(new Point(50, 75));
            _pathPoints.Add(new Point(100, 30));
            _pathPoints.Add(new Point(70, 15));
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    
    // Класс-обертка
    public class FlyProjectContext: INotifyPropertyChanged
    {

        FlyProject _project = null;
        public FlyProject Project 
        {
            get
            {
                return _project;
            }
            set
            {
                if (_project != null)
                    _project.PropertyChanged -= _project_PropertyChanged;

                _project = value;
                _project.PropertyChanged += new PropertyChangedEventHandler(_project_PropertyChanged);
                
            }
        }        

        public FlyProjectContext()
        {
            Project = new FlyProject();
        }

        public event PropertyChangedEventHandler PropertyChanged;

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

        private void _project_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            this.NotifyPropertyChanged("Project");
        }
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        FlyProjectContext _projectContext = new FlyProjectContext();

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = _projectContext;
        }
    }

Теперь в биндинге можно указать Path
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    <Window.Resources>
        <c:PathPointsConverter x:Key="conv1" />
    </Window.Resources>
    <!-- ... -->
        <Canvas Width="350" Height="200">
            <Path Stroke="Black" Data="{Binding Path='Project', Converter={StaticResource conv1}, Mode=OneWay}" />
        </Canvas>
     <!-- ... -->
    <TextBox Text="{Binding Path='Project.Bp', Mode=OneWay}" /> 
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Binding: изменение объектов не обрабатывается байднигом / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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