我有一个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属性上绑定此实例。
答案 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;
}
}