2014-01-22 5 views
0

У меня есть приложение WPF, у которого есть MainWindow, который разделен на 2 кадра один для левого меню навигации, а другой для страниц (например, страница addFirm, addlocation страница и т. д.). Теперь я хочу, чтобы в главном окне была строка состояния, в которой должны отображаться сообщения, поднятые на страницах. Что-то вроде этогоСвязывание текстового свойства текстового блока в StatusBar с разных страниц

<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> 

Теперь я хочу, чтобы заполнить StatusBarItem из свойства сообщений приведенного ниже класса вместо статического текста «ABC». PS: obejct этого класса создается на indivisual страницах, а не на главном окне

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"); 
     } 
    } 

} 

создать объект этого класса на indivisual страниц, а затем, когда операция будет завершена, то, как я установить свойство сообщения этого класса.

Единственная ссылка, которую мне не хватает, заключается в том, как я могу получить экземпляр этого класса, который установлен на странице (предположим, предположим, что на addlocation) на mainwindow.xaml. Также как связать этот экземпляр с текстовым свойством текстовой области.

ответ

0

У меня есть ответ на этот вопрос. Я сделал, чтобы передать экземпляр главной страницы в общий вспомогательный класс (статический) в статической переменной. Теперь создайте свойство на главной странице, которое вернет экземпляр строки состояния (sbMain). Вызовите класс вспомогательного статуса из основных форм и вызовите на нем метод обновления.

Добавить объект SmStatusBar в MainWindow также passthe экземпляр главного окна в классе, а initilization главной страницы, как показано ниже

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

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

Добавить статическое свойство по общему классу 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; 
    } 

} 
0

Если ваш объект StatusHelper является DataContext панели вы показано выше, то настройка привязки в XAML легко:

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

Если, например, что панель имеет объект PageViewModel как его DataContext, который содержит свойство StatusHelper с именем «Status», то вы можете привязать к нему следующим образом:

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

точный ответ зависит от того, как вы настроили свой вид-модель/данных контекста иерархии.

+0

Спасибо за ваш ответ. На панели выше не установлен набор данных.Также проблема заключается в том, что объект класса StatusHelper создается на уровне страницы, и я не могу понять, как я могу получить доступ к этому в главном окне. Другой вариант, о котором я думал, состоял в том, чтобы использовать статический класс и снова устанавливать свойства, я снова застреваю при доступе к объекту этого класса. Вариант, который приходит мне на ум, состоит в том, чтобы создать общий элемент управления для строки состояния, а затем использовать его на каждой странице, однако это не выглядит привлекательным для меня в данный момент. – Rachit

+0

У вас есть MainWindow, который должен отображать содержимое страницы, а также сообщение о статусе текущей страницы. Затем просто сохраните ссылку на модель представления текущей страницы в представлении-модели (контексте данных) MainWindow, например, как свойство CurrentPage. Тогда привязка будет: {Binding CurrentPage.Status.Message}. Вы знакомы с MVVM? –

0

Если у вас его еще нет, добавьте класс модели базового представления в приложение. Добавьте класс, который реализует Singleton Pattern для вашего приложения, так что его может быть только один экземпляр. Добавить ссылку на этот класс к вашей базовой модели зрения, обеспечивая вам доступ к нему только с помощью Instance свойства:

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

Теперь каждый вид модели в вашем приложении имеет доступ к свойствам из этого класса, так что поэтому вы можете данные привязать к ним со всех точек зрения:

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

Шеридан благодарит за ответ. Я получил аромат того, что вы предлагаете, но я достиг этого по-другому. Я попытался бы сделать это также, поскольку это выглядит более аккуратным с точки зрения реализации. – Rachit

Смежные вопросы