Заставить элемент управления WPF обновиться?
У нас есть два таких текстовых блока: (мы использовали .NET FW 3.0)
<TextBlock Grid.Column="0" Name="tabName" Style="{StaticResource textBlockBarStyle}" HorizontalAlignment="Left">
<TextBlock.Margin>
<Binding Converter="{StaticResource dpiConverter}">
<Binding.ConverterParameter>
<Thickness Left="3" Top="6" Right="0" Bottom="0"/>
</Binding.ConverterParameter>
</Binding>
</TextBlock.Margin>
</TextBlock>
и
<TextBox x:Name="txtBoxHelp"
IsReadOnly="True" Style="{DynamicResource txtBoxHelpStyle}"
IsTabStop="False"
Text="some text" MouseLeftButtonDown="txtBoxHelp_MouseLeftButtonDown">
<TextBox.Margin>
<Binding Converter="{StaticResource dpiConverter}">
<Binding.ConverterParameter>
<Thickness Left="7" Top="0" Right="0" Bottom="0"/>
</Binding.ConverterParameter>
</Binding>
</TextBox.Margin>
</TextBox>
Эти два текстовых блока хорошо работают на других ОС, но иногда пропускают домашнюю версию Windows XP с пакетом обновления 3 (SP3). Мы попробовали много способов обновить их, но не смогли.
Мы попробовали:
- UpdateLayout
- InvalidateVisual
- Изменено заданное свойство Text в коде в режиме привязки.
Как заставить эти элементы управления обновляться?
Ответы
Ответ 1
Thread thread = new Thread(new ThreadStart(delegate()
{
Thread.Sleep(200); // this is important ...
try
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Send,
new NoArgsHandle(delegate()
{
// do something, set .Text = "some text"
}));
}
catch { }
}));
thread.Name = "thread-UpdateText";
thread.Start();
Хорошо работает.
Ответ 2
Это работает для нас без необходимости создания нового потока. Он планирует начать действие, когда все привязки обновили себя в первую очередь.
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() =>
{
// Do something here.
}));
Ответ 3
Способ сделать обновление в реальном времени в WPF осуществляется с помощью привязки данных TwoWay. Поэтому убедитесь, что все свойства viewModel, которые вы связываете, являются свойствами зависимостей или реализуйте INotifyPropertyChanged (и обрабатываются правильно), а также их Binding.Mode = TwoWay.
Отъезд Rudi Grobler 10 вещей, которые я не знал о привязке данных WPF
Некоторые статьи привязки данных: