Просто для забавы, вместо регулярного выражения вы можете использовать следующую функцию 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]
Корень его был то, что строка, которую я передал PropertyChangedEventArgs, ТОЧНО не соответствовала названию свойства. У меня было что-то вроде этого:
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNum"); }
}
Где это должно быть это:
public int HouseNumber
{
get { return _houseNumber; }
set { _houseNumber = value; NotifyPropertyChanged("HouseNumber"); }
}
Черт! Спасибо за нажатие в правильном направлении.
Удостоверьтесь, что Вы обновляете 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();
}
}
Обратите внимание, что та же ссылка используется в коде обновления.
Необходимо ли установить обязательный режим программно? Это может принимать значение по умолчанию к OneTime.
У меня есть просто 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 очень хорошо.
Возможно, Вы смотрите в неправильном месте по причине проблемы?
Вы уверены, что обновляете тот же объект, как Вы использовали в привязке? На первый взгляд ничто не выглядит неправильным, так проверьте простые вещи.:)
Делает любой обход кода свойство, устанавливая поле (_houseNumber
) непосредственно?