在c#中从另一个类或静态方法更改wpf元素/控件

Nat*_*per 4 .net c# data-binding wpf events

我有一个MainWindow,它包含一个文本块[statusTextblock],它绑定到一个字符串[StatusText].StatusTextblock需要显示来自另一个窗口的组合框结果.当它在另一个窗口中发生变化时,我将这些数据传递回mainwindow,并且当发生这种情况时我已经创建了一个静态方法来更改字符串.

但是,所有这些的静态性使我无法在任何时候将我的textbox元素更改为StatusText的新值.

我考虑过工作,以便在用户返回Mainwindow时进行更改,但我没有成功.我尝试了激活和uielement gotfocus事件处理程序(我觉得第二个仍然是一个可能的修复).

如果重要的话,主窗口也恰好是开放的.我也更喜欢在代码中做事而不是xaml,但是感谢任何帮助.

有任何想法吗?

MainWindow xaml,然后是程序入口方法,然后静态事件来改变statusText

<TextBlock Margin="190,0,0,0" HorizontalAlignment="Right" Name="StatusTextBlock" Text= {Binding}" ></TextBlock>

public MainWindow() //Obviously more went here, but it's not relevent
    {
        StatusTextBlock.DataContext = statusText;
    }

static public void changeStatusText(string status)
    {
        statusText = status;
    }
Run Code Online (Sandbox Code Playgroud)

rob*_*her 7

当您尝试使用MVVM模式实现应用程序时,问题变得更容易解决.

  1. 定义一个具有字符串属性StatusText的视图模型类:

    public class MainViewModel : INotifyPropertyChanged
    { 
      private string _statusText;
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      public string StatusText
      {
        get
        {
            return _statusText;
        }
    
        set
        {
            if (value == _statusText)
                return;
    
            _statusText = value;
    
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("StatusText"));
        }
      }
    } 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将MainWindow的DataContext设置为MainViewModel的实例:

    public MainWindow  //Obviously more went here, but it's not relevant
    {  
       private static MainViewModel _mainViewModel = new MainViewModel();
    
       public MainWindow() 
       { 
          this.DataContext = _mainViewModel;
       }
    
       static public void ChangeStatusText(string status)
       { 
         _mainViewModel.StatusText = status;
       }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将数据绑定设置为视图模型:

     <TextBlock Margin="190,0,0,0" HorizontalAlignment="Right" Name="StatusTextBlock" Text="{Binding StatusText}" ></TextBlock>
    
    Run Code Online (Sandbox Code Playgroud)