Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Биндинг TextBox'а


Автор: dAlex 14.1.2011, 14:38
пытаюсь сделать DataBinding с даблами и текстбоксом, примерно так
Код


    public partial class Window1 : INotifyPropertyChanged
    {
        private PropertyChangedEventHandler _propertyChanged;

        event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
        {
            add { _propertyChanged += value; }
            remove { _propertyChanged -= value; }
        }
        private void NotifyPropertyChanged(string info)
        {
            if (_propertyChanged != null)
                _propertyChanged(this, new PropertyChangedEventArgs(info));
        }

        private double _h;

        public string h
        {
            get { return _h.ToString(); }
            set
            {
                _h = int.Parse(value);
                NotifyPropertyChanged("h");
            }
        }

        public Window1()
        {
            InitializeComponent();
            DataContext = this;
        }

Код

<TextBox DataContext="{Binding Path=h}" />

В итоге поле пустое все равно

Автор: jonie 14.1.2011, 15:02
dAlex, в окне Output студии что печатается? Уж не ошибка ли биндинга там проскакивает?)

Автор: dAlex 14.1.2011, 15:25
jonie, офигеть, и правда какие-то ошибки бидинга, сейчас буду смотреть. Что-то и не юзала это окно раньше почему-то. Спасибо =))

Добавлено через 5 минут и 28 секунд
jonie, эти ошибки в других биндингах =) про этот молчок

Автор: jonie 14.1.2011, 18:40
Потому что:
Код

<TextBox Text="{Binding Path=h, Mode=TwoWay}"/>

надобно.

Автор: dAlex 15.1.2011, 00:09
jonie, надо будет почитать про режимы, пока мало работала с такими штуками =) спасибо большое, попробую =)

Автор: jonie 15.1.2011, 11:28
dAlex, там не режим изменен, а еще и свойство другое биндится.

Автор: dAlex 18.1.2011, 12:53
jonie, 
   вот же она, сила копипаста, точно, какой там DataContext, shame on me. Спасибо огромное =)

Автор: dAlex 30.1.2011, 23:20
а нет, все же косяк. При запуске программы данные в полях есть, но при их изменении они не обновляются. В какую сторону копать? Таким же образом был сделан биндинг ListView, там все в порядке

Автор: dAlex 31.1.2011, 10:55
получилось только таким извратским способом
Код

TextBox1.GetBindingExpression( TextBox.TextProperty).UpdateTarget()

Автор: gambit 31.1.2011, 14:29
Цитата(dAlex @  30.1.2011,  23:20 Найти цитируемый пост)
При запуске программы данные в полях есть, но при их изменении они не обновляются

Код

Text="{Binding Path=h, UpdateSourceTrigger=PropertyChanged}"

А что бы избежать такого изврата:
Код

private double _h;
        public string h
        {
            get { return _h.ToString(); }
            set
            {
                _h = int.Parse(value);
                NotifyPropertyChanged("h");
            }
        }

посмотрите что такое конвертеры.

ps. Вдруг кому пригодится, когда то написал сниппет, для автоматического добавления NotifyPropertyChanged("h"); в свойства.
Код

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>propvm</Title>
      <Shortcut>propvm</Shortcut>
      <Description>Code snippet for property and backing field</Description>
      <Author>Microsoft Corporation</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <ToolTip>Property type</ToolTip>
          <Default>string</Default>
        </Literal>
        <Literal>
          <ID>property</ID>
          <ToolTip>Property name</ToolTip>
          <Default>MyProperty</Default>
        </Literal>
        <Literal>
          <ID>field</ID>
          <ToolTip>The variable backing this property</ToolTip>
          <Default>myVar</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[private $type$ $field$;

    public $type$ $property$
    {
        get { return $field$;}
        set
    {
    $field$ = value;
    RaisePropertyChanged("$property$");
    }
    }
    $end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Автор: Brilona 31.1.2011, 15:03
Сниппет - вещь полезная smile Спасибо!

Автор: Kaerus 31.1.2011, 17:17
Не могу говорить за Prism, но в MVVM Toolkit такие шорткаты в комплекте уже идут. Хотя я тоже свой написал, ибо там они слишком громозкие (зато составлены по всем правилам хорошего кодинга)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)