【问题标题】:c# WPF Update Window on Button Clickc# WPF更新窗口按钮点击
【发布时间】:2018-10-31 05:25:55
【问题描述】:

我一直在使用 Visual Studio 中的 c#(相当新),并且一直在尝试使用 WPF 构建应用程序,但我似乎无法弄清楚在我的环境中如何在单击按钮时更新我的​​ WPF 视图.我试图将我的代码筛选到相关信息

我的 .cs 文件中有以下场景

class Program
{

    [STAThread]
    static void Main(string[] args)
    {

        try
        {
            using (VMS.TPS.Common.Model.API.Application app = VMS.TPS.Common.Model.API.Application.CreateApplication("null", "null"))
            {
                Execute(app);
            }
        }
        catch (Exception e)
        {

            MessageBox.Show(e.ToString());

        }
    }


    static void Execute(VMS.TPS.Common.Model.API.Application app)
    {
        Window window = new Window();
        MainWindow mainWindow = new MainWindow(app);
        mainWindow.evalButton.Click += Eval_Click //Button defined in .xaml

        //Add a bunch of items

        window.ShowDialog();
    }
    public static void Eval_Click(object sender, EventArgs e)
    {
        //need to add some more stuff to mainWindow and update window
    }
}

我的 MainWindow.xaml 文件的类定义为 .MainWindow,MainWindow.xaml.cs 文件如下

public partial class MainWindow : UserControl
{

    private VMS.TPS.Common.Model.API.Application _application;

    public MainWindow(VMS.TPS.Common.Model.API.Application Application)
    {
        _application = Application;


        InitializeComponent();

    }

}

【问题讨论】:

  • 在这种情况下“更新我的 WPF 视图”是什么意思?
  • 也许措辞不正确。也许将新的 xaml 元素附加到现有窗口或关闭现有窗口并再次抛出 window.ShowDialog()。窗口视图只需要使用新元素进行更新。
  • 你如何“添加一堆项目”?您是否要添加到实际上是 UserControl 的“MainWindow”?

标签: c# wpf


【解决方案1】:

如果您希望您的View 图层在按下按钮时更新,您可以重新分配DataContext。例如:

public static void Eval_Click(object sender, EventArgs e)
{
    this.DataContext = new MyDataContext();
}

但是如果您遵循 MVVM 模式,您的 DataContext 应该继承自 INotifyPropertyChanged 接口,您也可以只调用 PropertyChangedEventHandler 事件来更新 View 层中的特定绑定。例如:

public event PropertyChangedEventHandler PropertyChanged;  
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")  
{  
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void UpdateView()
{
    NotifyPropertyChanged("foo");
    NotifyPropertyChanged("bar");
}  

...

public static void Eval_Click(object sender, EventArgs e)
{
    (this.DataContext as MyDataContext).UpdateView();
}

【讨论】:

  • 我无法让它工作,但这可能是我的技术能力。我通过将 window 和 mainwindow 声明为全局项来管理解决方案,然后可以在 eval click 函数中访问它们的上下文。可能不是最好的解决方案,但可以正常工作。
猜你喜欢
  • 2018-04-23
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多