2014-07-23 4 views
0

내 목적은 내 기본 UI 창에 텍스트 블록을 추가하는 것입니다. 필요한 경우 텍스트가 업데이트됩니다. 이를 위해, 내 UIWindow의 XAML에서 나는 다음과 같이했다 : 데이터 바인딩 및 WPF의 다른 클래스에서 호출

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

    } 

} 

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

이 뒤에 코드입니다

이제 여기에 두 가지 문제가 있습니다.

처음으로, 내 UI 창이 시작될 때 실제로 "consoleText"다음에 "변경된 내용"이라는 두 개의 메시지 상자가 나타납니다. 즉, consoleText이 성공적으로 변경되었음을 의미합니다. 하지만 내 UIWindow가 나타나면 텍스트 블록이 비어 있으며 "Hello User!"가 표시되지 않습니다. 그곳에. Text="{Binding Path=consoleText} 부분이 내 xaml 파일에서 올바르게 작동하지 않는 것 같습니다.

두 번째로 가장 중요한 것은입니다. 다른에있는 consoleText을 다른 클래스로 변경하고 싶습니다. 이를 위해 나는 어떤 해결책도 찾아 내지 못했습니다. 제안의 모든 종류가 많이 이해할 수있을 것이다

namespace UIDesigner 
{ 
    public partial class DesignerCanvas 
    { 

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

: 내 DesignerCanvas.Commands.cs이 같은 일을합니다. 두

답변

2

1.First은 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

내 두 번째 질문에서, 내 textblock에서 "updatedConsoleText"를 볼 것으로 예상했습니다.그러나 "changeConsoleOutput"함수를 호출하면 텍스트가 업데이트되지 않고 시작된 후 "Hello User"가 표시됩니다. –

관련 문제