Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обновить Source of Binding из кода 
:(
    Опции темы
sealmu
  Дата 13.11.2011, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



у меня есть UserControl с 2-мя DependencyProperty:


Код

        public static readonly DependencyProperty InProperty = DependencyProperty.Register("In", typeof(object), typeof(broker), new PropertyMetadata(null, new PropertyChangedCallback(InChanged)));

        public static readonly DependencyProperty OutProperty = DependencyProperty.Register("Out", typeof(object), typeof(broker), new PropertyMetadata(null, new PropertyChangedCallback(OutChanged)));



который я использую в XAML :

 <local:Observer In="{Binding ElementName=tb, Path=Text}" Out="{Binding ElementName=tb2, Path=Tag}"></local:ComboObserver>


Я хочу при изменении In ->  поменять свойство привязоное к Out
но если я меняю Out,  просто теряеться Binding.

Как обновлять привязаное к  Out  свойство?
PM MAIL   Вверх
Gvozdin
Дата 13.11.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Помоему надо использовать метод DependencyObject.SetCurrentValue
если не он, то пожже погляжу точнее
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
sealmu
Дата 13.11.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Я пробую так  :


        private static void InChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            broker DP = (broker)sender;

            if (DP != null)
            {
                DP.SetCurrentValue(OutProperty, DP.In);
                BindingExpression b = DP.GetBindingExpression(OutProperty);
                if (b != null)
                    b.UpdateSource();
            }
        }


не обновляет!
(хотя в In и содержиться значение)
PM MAIL   Вверх
Gvozdin
Дата 14.11.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



А зачем для OutProperty говорить UpdateSource?

Вы байндинг такой случаем не ставите this.SetBinding(OutProperty, <binding>)?

У меня вот собственно все работает, можете сами попробовать:

Код

<Window x:Class="WpfApplication22.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" x:Name="userControl">
    <StackPanel>
        <TextBox Text="{Binding Test, ElementName=userControl}"/>
        <Button x:Name="btn" Content="Btn"/>
    </StackPanel>
</Window>


Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication22
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(int), typeof(MainWindow), new FrameworkPropertyMetadata());
        public int Test
        {
            get { return (int)GetValue(TestProperty); }
            set { SetValue(TestProperty, value); }
        }  
        
        public MainWindow()
        {
            this.Test = 11;
            InitializeComponent();
            this.btn.Click += new RoutedEventHandler(btn_Click);
        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            this.SetCurrentValue(TestProperty, Test + 1);
        }
    }
}



Скорее дело где-то в вашем коде. По крайней мере уберите UpdateSource.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
sealmu
Дата 19.11.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Нет не так!
У меня наоборот.

в этом коде привязка от textbox ------>  к Test property
и обновление идет от Test --------> к testbox
[source ----> target]


у меня же :


привязка от MyProperty (через SetBinding) ------>  к textbox
обновление идет от MyProperty --------> к testbox
[target ---> source]
PM MAIL   Вверх
Gvozdin
Дата 19.11.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Вот пожалуйста в обратную сторону:

Код

<Window x:Class="WpfApplication22.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" x:Name="userControl">
    <StackPanel>
        <TextBox x:Name="tb"/>
        <Button x:Name="btn" Content="Btn"/>
    </StackPanel>
</Window>


Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication22
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(int), typeof(MainWindow), new FrameworkPropertyMetadata() { DefaultValue = 11 });
        public int Test
        {
            get { return (int)GetValue(TestProperty); }
            set { SetValue(TestProperty, value); }
        }  
        
        public MainWindow()
        {
            this.Test = 11;
            InitializeComponent();
            this.btn.Click += new RoutedEventHandler(btn_Click);
            var exp = this.SetBinding(TestProperty, new Binding() { Path = new PropertyPath(TextBox.TextProperty), Source = this.tb, Mode = BindingMode.TwoWay });
            exp.UpdateSource();
        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            this.SetCurrentValue(TestProperty, Test + 1);
        }
    }
}


Все работает хоть в какую сторону. Я думаю что-то надо смотреть в сторону local:Observer.

Байндинг может отваливаться если:
1. ClearBinding и наверное ClearValue какое-нибдуь
2. Устанавливаем новый байндинг
3. Бывают тупые случаи когда OneWay байндинг отваливается когда ему захочется, попробуйте везде поставить явно TwoWay
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.