2014-07-23 48 views
0

我的目的是添加一個文本塊到我的主UI窗口,其中的文本將根據需要進行更新。對於這一點,在我的UIWindow XAML我不喜歡這樣的:數據綁定,然後從WPF中的另一個類調用

<Window x:Class="UIDesigner.UIWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:s="clr-namespace:UIDesigner" 
    xmlns:c="clr-namespace:UIDesigner.Controls" 
    WindowStartupLocation="CenterScreen"   
    WindowState="Maximized" 
    WindowStyle="SingleBorderWindow" 
    Title="GUI" 
    Height="1000" Width="1400" 
    HorizontalAlignment="Center" 
    VerticalAlignment="Top" 
    Icon="Resources/Images/Logo.png"   
    > 

<Grid Margin="0"> 
    <Grid Grid.Row="1" Margin="0,10,0,0"> 

    <GroupBox Header="Console" Grid.Column="1" Margin="0,590,0,0" HorizontalAlignment="Stretch" x:Name="consoleWindow" IsEnabled="True" VerticalAlignment="Stretch" 
       > 
     <TextBlock x:Name="myConsoleWindowTextBlock" Text="{Binding Path=consoleText}"/> 
    </GroupBox> 
    </Grid> 
</Grid> 

</Window> 

這是後面的代碼:

using System.Windows; 
using System.Runtime.CompilerServices; 
using System.ComponentModel; 

namespace UIDesigner 
{ 
    public partial class UIWindow : Window 
    { 
     public UIWindow() 
     { 
      InitializeComponent(); 
     } 


     private string _consoleText; 
     public string consoleText 
     { 
      get{ return _consoleText;} 
      set 
      { 
       _consoleText = value; 
       NotifyPropertyChanged("consoleText"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged(string info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 
    } 
} 

然後在我的主類,我稱之爲UIWindow這樣的:

namespace UIDesigner 
{ 
    public partial class Main : Window 
    { 
     public Main() 
     { 
      InitializeComponent(); 
     } 

    private void LoginButton_Click_1(object sender, RoutedEventArgs e) 
    {   
      var myUIWindow = new UIWindow();     
      myUIWindow.PropertyChanged += new PropertyChangedEventHandler(UIWindow_PropertyChanged); 

      myUIWindow.consoleText = "Hello User!"; 
      myUIWindow.ShowDialog(); 

      this.Close(); 

    } 

    private void LoginButton_MouseEnter_1(object sender, MouseEventArgs e) 
    { 
    } 

    static void UIWindow_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     MessageBox.Show("Something Changed!"); 
     MessageBox.Show(e.PropertyName); 
    } 

    } 

} 

現在我在這裏有兩個問題:

第一個,當我的UI窗口開始時,我確實收到了兩個消息框,說「改變了一些東西」,然後是「consoleText」。這意味着consoleText已成功更改。但是在我的UIWindow出現之後,textblock是空的,我看不到「Hello User!」那裏。似乎Text="{Binding Path=consoleText}部分在我的xaml文件中無法正常工作。

其次,最重要的,我想改變consoleText在另一個不同的階級,即DesignerCanvas.Commands.cs。爲此,我找不出任何解決方案。我想在我的這樣的東西DesignerCanvas.Commands.cs

namespace UIDesigner 
{ 
    public partial class DesignerCanvas 
    { 

     private void changeConsoleOutput(string updatedConsoleText) 
     { 
      myUIWindow.consoleText = updatedConsoleText; //obviously, this is not working 
     } 
    } 
} 

任何類型的建議將不勝感激。

回答

2

兩個1.首先設置UI值,只需要添加下面一行

在UIWindow類的構造函數

this.DataContext=this; 

//因爲只有指定屬性consoletext,它將不能夠知道在哪裏找到consoletext。

2.u可以在App.Current.Windows中找到該UIwindow並將其轉換爲UIWindow類型,然後可以 訪問該屬性。

foreach(Window win in App.Current.Windows) 
      { 
       if (win as UIWindow != null) 
       { 
        (win as UIWindow).consoletext = updatedConsoleText; 
       } 
      } 

對於第二個問題

變化

<TextBlock x:Name="myConsoleWindowTextBlock" Text="{Binding Path=consoleText}"/ 

<TextBlock x:Name="myConsoleWindowTextBlock" Text="{Binding Path=.}"/ 

在一個UIWindow構造

設置

myConsoleWindowTextBlock.Datacontext=consoleText; 
+0

非常感謝您的回答。在你的幫助下,我解決了第一個問題,並解決了第一個問題。因爲在更改另一個類中的consoleText後,我還可以看到消息框,但textBlock沒有更新,顯示「Hello User」而不是新消息。我試圖將「this.DataContext = this」也添加到它的構造函數中。你能指出嗎?謝謝。 –

+0

對不起,但沒有得到..哪些功能不起作用 –

+0

在我的第二個問題中,我期待在我的文本塊中看到「updatedConsoleText」。但是當我調用「changeConsoleOutput」函數時,它會在啓動後顯示「Hello User」,而不會更新文本。 –