我遇到了将值绑定到控件的问题。我查看了其他窗口,我想我也是这样做的。 我希望在主窗口打开之前显示类似于从App加载窗口的内容。问题是没有任何变化(文本/内容/控件的价值)。
InitizalizationWindow:
public InitializationWindow()
{
...
InitializationWindowClass.Progress = new InitializationWindowClass();
this.mainSP.DataContext = InitializationWindowClass.Progress;
}
和xaml的一部分:
<StackPanel Name="mainSP" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="0, 0, 0, 10">
<TextBlock x:Name="tblProgress" FontSize="14" Text="{Binding ProgressText}" TextAlignment="Center" TextWrapping="Wrap" />
<Grid>
<telerik:RadProgressBar x:Name="progress" Value="{Binding ProgressValue}" telerik:StyleManager.Theme="Summer" Height="25" IsIndeterminate="False" />
<Label x:Name="lblPercent" FontWeight="Bold" Content="{Binding ProgressValueString}" HorizontalAlignment="Center" VerticalContentAlignment="Center" />
</Grid>
</StackPanel>
InitializationWindowClass:
public class InitializationWindowClass : INotifyPropertyChanged
{
public static InitializationWindowClass Progress { get; set; }
private string progressText = String.Empty, progressValueString = String.Empty;
private int progressValue = 0;
public event PropertyChangedEventHandler PropertyChanged;
public string ProgressText
{
get
{
return progressText;
}
set
{
progressText = value;
NotifyPropertyChanged("ProgressText");
}
}
public string ProgressValueString
{
get
{
return progressValueString;
}
set
{
progressValueString = value;
NotifyPropertyChanged("ProgressValueString");
}
}
public int ProgressValue
{
get
{
return progressValue;
}
set
{
progressValue = value;
ProgressValueString = String.Format("{0}%", progressValue);
NotifyPropertyChanged("ProgressValue");
NotifyPropertyChanged("ProgressValueString");
}
}
private void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
和App.xaml.cs的一部分:
protected override void OnStartup(StartupEventArgs e)
{
InitializationWindow iw = new InitializationWindow();
iw.Show();
InitializationWindowClass.Progress.ProgressValue = Convert.ToInt32(((decimal)count / (decimal)sum) * 100);
InitializationWindowClass.Progress.ProgressText = "Some text";
...
...
InitializationWindowClass.Progress.ProgressValue = Convert.ToInt32(((decimal)count / (decimal)sum) * 100);
InitializationWindowClass.Progress.ProgressText = "New text";
...
...
}
我检查过,当我从App.xaml.cs更改即ProgressValue时,值正在改变 - 转到
get
{
return progressValue;
}
所以问题是 - 我做错了什么?
答案 0 :(得分:1)
这是一个线程问题。绑定更改将发布到Dispatcher,然后UI线程将这些事件从Dispatcher队列中拉出并处理它们。
在这里,您正在更改OnStartup
事件中的绑定,该事件本身由UI线程处理。这意味着在退出OnStartup
事件之前,不会处理这些绑定更改。您最终在用户界面中看到的内容只是上次更改时这些进度属性的值。
您需要做的是将进度报告移至另一个线程。换句话说,使用OnStartup
/ async
或其他一些线程机制将await
事件中当前完成的工作转移到另一个线程。
原始的,错误的答案如下:
ProgressText
,ProgressValueString
和ProgressValue
是InitializationWindowClass
上的所有属性,而不是InitializationWindow
。看起来您需要将DataContext
上的StackPanel
设置为指向Progress
的{{1}}属性,或者将InitializationWindow
属性作为一部分包含在内各个元素的绑定路径。
就是这样:
Progress
或者这个:
<StackPanel ... DataContext="{Binding Progress}">
... rest the same ...
</StackPanel>
答案 1 :(得分:0)
你在做什么赢了工作。您正在同一个线程上显示启动画面并执行加载操作。这样,当您的加载操作运行时,即使后台中的数据正在正确更改,主UI线程也很忙并且不会更新。这就是为什么你可能正在等待&#34;等待&#34;光标,你的启动窗口没有响应,你的主窗口可能根本不显示。
Here你有一个很好的例子,在wpf
中使用SplashScreen