powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding
4 сообщений из 4, страница 1 из 1
Binding
    #39390706
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вечер добрый.
Есть контрол:
Код: c#
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.
internal partial class EntitySelector
{
    public EntitySelector()
    {
        InitializeComponent();

        var viewModel = new EntitySelectorViewModel();
        DataContext = viewModel;

        var binding = new Binding
        {
            Path = new PropertyPath("SelectedEntityCode"),
            Source = viewModel,
            Mode = BindingMode.TwoWay,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };
        BindingOperations.SetBinding(this, SelectedEntityProperty, binding);
    }

    public static readonly DependencyProperty SelectedEntityProperty =
        DependencyProperty.Register
        (
            "SelectedEntity",
            typeof(string),
            typeof(EntitySelector),
            new FrameworkPropertyMetadata(default(string), 
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                SelectedEntityProperty_Changed)
        );

    public string SelectedEntity
    {
        get { return Convert.ToString(GetValue(SelectedEntityProperty)); }
        set { SetValue(SelectedEntityProperty, value); }

    }

    private static void SelectedEntityProperty_Changed(DependencyObject dobj, DependencyPropertyChangedEventArgs e)
    {
       //Some code     
    }
}


Не получается забиндить св-во контрола на св-во вьюхи. Время позднее, где-то туплю, но не пойму где?
Св-во вьюхи:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public string SelectedEntityCode
{
    get { return _selectedEntityCode; }
    set
    {
        if (_selectedEntityCode != value)
        {
            _selectedEntityCode = value;
            OnPropertyChanged(() => SelectedEntityCode);
        }
    }
}
...
Рейтинг: 0 / 0
Binding
    #39391373
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_ПавВечер добрый.
Есть контрол:
Код: c#
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.
internal partial class EntitySelector
{
    public EntitySelector()
    {
        InitializeComponent();

        var viewModel = new EntitySelectorViewModel();
        DataContext = viewModel;

        var binding = new Binding
        {
            Path = new PropertyPath("SelectedEntityCode"),
            Source = viewModel,
            Mode = BindingMode.TwoWay,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };
        BindingOperations.SetBinding(this, SelectedEntityProperty, binding);
    }

    public static readonly DependencyProperty SelectedEntityProperty =
        DependencyProperty.Register
        (
            "SelectedEntity",
            typeof(string),
            typeof(EntitySelector),
            new FrameworkPropertyMetadata(default(string), 
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                SelectedEntityProperty_Changed)
        );

    public string SelectedEntity
    {
        get { return Convert.ToString(GetValue(SelectedEntityProperty)); }
        set { SetValue(SelectedEntityProperty, value); }

    }

    private static void SelectedEntityProperty_Changed(DependencyObject dobj, DependencyPropertyChangedEventArgs e)
    {
       //Some code     
    }
}


Не получается забиндить св-во контрола на св-во вьюхи. Время позднее, где-то туплю, но не пойму где?
Св-во вьюхи:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public string SelectedEntityCode
{
    get { return _selectedEntityCode; }
    set
    {
        if (_selectedEntityCode != value)
        {
            _selectedEntityCode = value;
            OnPropertyChanged(() => SelectedEntityCode);
        }
    }
}


от чего унаследован EntitySelector? Это Window, UserControl, Control?

может просто когда происходит Binding значение в модели равно null, а так как у свойства зависимости значение по умолчанию default(string) = null, то и изменений в свойстве не происходит, а значит не вызывается метод SelectedEntityProperty_Changed. Этот метод будет вызван только в том случае, если значение отличается от предыдущего. Проверка идет вроде через Equals()

такой подход как по мне просто корявый, в данном случае нет ни какого необходимости создавать binding в коде.
зато потом, когда надо будет понять, от куда это свойство берёт значение, надо будет искать и не факт, что сразу найдешь, что нужно. можно точно так же в XAML определить связывания для свойства зависимости SelectedEntityProperty через MarkupExtension {Binding}.
А вот это вообще нафига? OnPropertyChanged(() => SelectedEntityCode);? для передачи имени можно использовать nameof(SelectedEntityCode) (работает начиная с C#6 (VS2015)) на сколько я помню.
...
Рейтинг: 0 / 0
Binding
    #39391548
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesот чего унаследован EntitySelector? Это Window, UserControl, Control?

может просто когда происходит Binding значение в модели равно null, а так как у свойства зависимости значение по умолчанию default(string) = null, то и изменений в свойстве не происходит, а значит не вызывается метод SelectedEntityProperty_Changed. Этот метод будет вызван только в том случае, если значение отличается от предыдущего. Проверка идет вроде через Equals()

такой подход как по мне просто корявый, в данном случае нет ни какого необходимости создавать binding в коде.
зато потом, когда надо будет понять, от куда это свойство берёт значение, надо будет искать и не факт, что сразу найдешь, что нужно. можно точно так же в XAML определить связывания для свойства зависимости SelectedEntityProperty через MarkupExtension {Binding}.
А вот это вообще нафига? OnPropertyChanged(() => SelectedEntityCode);? для передачи имени можно использовать nameof(SelectedEntityCode) (работает начиная с C#6 (VS2015)) на сколько я помню.
EntitySelector контрол. Значение во вьюхе действительно равно нул, но оно меняется пользователем на форме. Соответственно, как я понимаю биндинг, должно поменяться и в св-ве контрола. По поводу нафига мне OnPropertyChanged(() => SelectedEntityCode), это хвост из прошлого, когда еще была 2010 студия. Меня вполне устраивает такой вариант. Это вызов PropertyChangedEventHandler PropertyChanged;
...
Рейтинг: 0 / 0
Binding
    #39391734
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте создать Binding в событии Loaded, либо через диспатчер с таким же приоритетом, думаю это точно поможет
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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