将StatusBar中文本块的text属性绑定到不同的页面

时间:2014-01-22 09:48:16

标签: c# wpf xaml wcf-binding

我有一个WPF应用程序,它有一个MainWindow,分为2帧,一个用于左侧导航菜单,另一个用于页面(如addFirm页面,addlocation页面等)。现在我想在主窗口上显示一个状态栏,它必须显示页面中引发的消息。像这样的东西

<DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" LastChildFill="True"  >
    <StackPanel DockPanel.Dock="Top" Style="{DynamicResource SMMainStackPanel}" >
        <Border Style="{DynamicResource SMBorder}"  >
          <Label Content="System" FontSize="18" HorizontalContentAlignment="Center" />
        </Border>
    </StackPanel>
    <StackPanel DockPanel.Dock="Left" Style="{DynamicResource SMMainStackPanel}">
        <Border VerticalAlignment="Stretch" Style="{DynamicResource SMBorder}"  >
            <Frame Name="frame1" Source="Menu.xaml" Style="{DynamicResource SMMainFrame}" />
        </Border>
    </StackPanel>
    <StackPanel Style="{DynamicResource SMMainStackPanel}" >
       <Border Style="{DynamicResource SMBorder}" >                
            <Frame Name="frame2" Style="{DynamicResource SMMainFrame}"/>
        </Border>
        <DockPanel  VerticalAlignment="Stretch" HorizontalAlignment="Stretch" DockPanel.Dock="Bottom">
                   <StatusBar>
                    <StatusBar.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="4*"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                            </Grid>
                        </ItemsPanelTemplate>
                    </StatusBar.ItemsPanel>
                    <StatusBarItem>
                        <TextBlock>Ready</TextBlock>
                    </StatusBarItem>
                    <StatusBarItem Grid.Column="1">
                        <ProgressBar Value="30" Width="80" Height="18"/>
                    </StatusBarItem>
                    <StatusBarItem Grid.Column="2">
                    <TextBlock Text= "ABC" />
                    </StatusBarItem>
                    <StatusBarItem Grid.Column="3">
            <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}}"/>
                    </StatusBarItem>
                </StatusBar>
        </DockPanel>
    </StackPanel>
</DockPanel>

现在我想从下面的类的message属性而不是静态文本“ABC”填充StatusBarItem。 PS:这个类的对象是在个人页面上创建的,而不是在主窗口上创建

public class StatusHelper : INotifyPropertyChanged 
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _message;

    private void OnPropertyChanged(String property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    public string Message
    {
        get
        {
            return _message;
        }
        set
        {
            _message = value;
            OnPropertyChanged("Message");
        }
    }

}

我在个人页面上创建了这个类的对象,然后当一个操作完成时,我如何设置这个类的message属性。

我唯一缺少的链接是如何在mainwindow.xaml上获取在页面上设置的这个类的实例(比如假设在addlocation上)。另外,我如何在文本区域的text属性上绑定此实例。

3 个答案:

答案 0 :(得分:0)

如果您的StatusHelper对象是您在上面显示的面板的DataContext,那么在XAML中设置绑定很容易:

<TextBlock Text="{Binding Message}" />

例如,如果该面板有一个PageViewModel对象作为其DataContext,其中包含一个名为“Status”的StatusHelper属性,那么您可以按如下方式绑定它:

<TextBlock Text="{Binding Status.Message}" />

确切的答案取决于您如何设置视图模型/数据上下文层次结构。

答案 1 :(得分:0)

如果您还没有,请为您的应用程序添加基本视图模型类。将一个实现Singleton Pattern的类添加到您的应用程序中,以便只能有一个实例。将该类的引用添加到基本视图模型,确保只使用Instance属性访问它:

public StateManager StateManager
{
    get { return stateManager.Instance; }
}

现在,应用程序中的每个视图模型都可以访问此类中的属性,因此您可以从每个视图中将数据绑定到它们:

<TextBlock Text= "{Binding StateManager.YourPropertyName}" />

答案 2 :(得分:0)

我得到了这个问题的答案。我所做的是将主页面的实例传递给静态变量中的公共辅助类(它是静态的)。现在在主页面上创建一个属性,该属性将返回状态栏的实例(sbMain)。从主表单调用status helper类并在其上调用update方法。

将属性SmStatusBar添加到MainWindow也将实例传递给主窗口,同时启动主页面如下所示

    public SmStatusBar StatusBar 
    {
        get { return this.sbMain; }
    }

    public MainWindow()
    {
        InitializeComponent();
        CommonHelper.SmMainWindow = this;
    }

在Common Helper类上添加一个静态属性

    public static MainWindow MainWindow { get; set; }

现在创建一个StatusHelper类

public static class StatusHelper
{
    private static SmStatusBar _statusBar;

    static StatusHelper()
    {
        _statusBar = CommonHelper.SmMainWindow.StatusBar;
    }

     public static bool UpdateStatus(string text)
     {
         _statusBar.UpdateStatusText(text);
         return true;
     }

}