Проблема с привязкой данных WPF, определенной в коде, не обновляющем элементы UI

Просто для забавы, вместо регулярного выражения вы можете использовать следующую функцию javascript:

let original = '|1.774|1.78|1|||||1.781|1||||||||';

let str = original.split('|').map((e, i, arr) => {
    // 1) if the element is not on the end of the split array...
    // 2) and if element is empty ('')
    // -> there's no data between '|' chars, so convert from empty string to space (' ')
    if (i > 0 && i < arr.length -1 && e === '') return ' ';
    // otherwise return original '|' if there is data found OR if element is on the end
    // -> of the split array
    else return e
}).join('|')

Регулярное выражение Wiktor довольно красиво, но я просто подумал, что предложу простую версию JS. [ 112]

8
задан Ben McIntosh 2 January 2009 в 11:47
поделиться

6 ответов

Корень его был то, что строка, которую я передал PropertyChangedEventArgs, ТОЧНО не соответствовала названию свойства. У меня было что-то вроде этого:

public int HouseNumber
{
    get { return _houseNumber; }
    set { _houseNumber = value; NotifyPropertyChanged("HouseNum"); }
}

Где это должно быть это:

public int HouseNumber
{
    get { return _houseNumber; }
    set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}

Черт! Спасибо за нажатие в правильном направлении.

10
ответ дан 5 December 2019 в 09:26
поделиться

Удостоверьтесь, что Вы обновляете AddressBook ссылка, которая использовалась в привязке и не некотором другом AddressBook ссылка.

Я заставил следующее работать с кодом AddressBook, который Вы дали.

<StackPanel>
    <Button Click="Button_Click">Random</Button>
    <Grid x:Name="myGrid">
    </Grid>
</StackPanel>

Код позади:

public partial class Window1 : Window
{
    private AddressBook book;

    public Window1()
    {
        InitializeComponent();

        book = new AddressBook();
        book.HouseNumber = 13;

        TextBlock tb = new TextBlock();
        Binding bind = new Binding("HouseNumber");
        bind.Source = book;
        tb.SetBinding(TextBlock.TextProperty, bind);
        myGrid.Children.Add(tb);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Random rnd = new Random();
        book.HouseNumber = rnd.Next();
    }
}

Обратите внимание, что та же ссылка используется в коде обновления.

3
ответ дан 5 December 2019 в 09:26
поделиться

Необходимо ли установить обязательный режим программно? Это может принимать значение по умолчанию к OneTime.

2
ответ дан 5 December 2019 в 09:26
поделиться

У меня есть просто cut+pasted Ваш код (и добавил немного), и он хорошо работает для меня:

    public Window1()
    {
        InitializeComponent();

        AddressBook book = new AddressBook();
        book.HouseNumber = 123;
        TextBlock tb = new TextBlock();
        Binding bind = new Binding("HouseNumber");
        bind.Source = book;
        bind.Mode = BindingMode.OneWay;
        tb.SetBinding(TextBlock.TextProperty, bind); // Text block displays "123"
        myGrid.Children.Add(tb);
        book.HouseNumber = 456; 
    }

    private void TestButton_Click(object sender, RoutedEventArgs e)
    {
        AddressBook book = 
           (AddressBook(TextBlock)
              myGrid.Children[0])
              .GetBindingExpression(TextBlock.TextProperty)
              .DataItem;

        book.HouseNumber++;
    }

Дисплеи 456 на запуске, нажимая кнопку делают число в инкременте TextBlock очень хорошо.

Возможно, Вы смотрите в неправильном месте по причине проблемы?

2
ответ дан 5 December 2019 в 09:26
поделиться

Вы уверены, что обновляете тот же объект, как Вы использовали в привязке? На первый взгляд ничто не выглядит неправильным, так проверьте простые вещи.:)

1
ответ дан 5 December 2019 в 09:26
поделиться

Делает любой обход кода свойство, устанавливая поле (_houseNumber) непосредственно?

0
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: