绑定值的问题

时间:2015-01-15 13:22:31

标签: c# wpf xaml data-binding binding

我遇到了将值绑定到控件的问题。我查看了其他窗口,我想我也是这样做的。 我希望在主窗口打开之前显示类似于从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;
}

所以问题是 - 我做错了什么?

2 个答案:

答案 0 :(得分:1)

这是一个线程问题。绑定更改将发布到Dispatcher,然后UI线程将这些事件从Dispatcher队列中拉出并处理它们。

在这里,您正在更改OnStartup事件中的绑定,该事件本身由UI线程处理。这意味着在退出OnStartup事件之前,不会处理这些绑定更改。您最终在用户界面中看到的内容只是上次更改时这些进度属性的值。

您需要做的是将进度报告移至另一个线程。换句话说,使用OnStartup / async或其他一些线程机制将await事件中当前完成的工作转移到另一个线程。


原始的,错误的答案如下:

ProgressTextProgressValueStringProgressValueInitializationWindowClass上的所有属性,而不是InitializationWindow。看起来您需要将DataContext上的StackPanel设置为指向Progress的{​​{1}}属性,或者将InitializationWindow属性作为一部分包含在内各个元素的绑定路径。

就是这样:

Progress

或者这个:

<StackPanel ... DataContext="{Binding Progress}">
    ... rest the same ...
</StackPanel>

答案 1 :(得分:0)

你在做什么赢了工作。您正在同一个线程上显示启动画面并执行加载操作。这样,当您的加载操作运行时,即使后台中的数据正在正确更改,主UI线程也很忙并且不会更新。这就是为什么你可能正在等待&#34;等待&#34;光标,你的启动窗口没有响应,你的主窗口可能根本不显示。

  • SplashScreen应显示在不同的线程上
  • 您必须有一种与该线程进行通信的方式,因为:
  • 您无法使用其他线程直接从一个线程更新UI

Here你有一个很好的例子,在wpf

中使用SplashScreen