从WPF应用程序类访问变量的首选方式



在下面的代码中,我声明应用程序级static变量,然后从MainWindow.xaml.cs访问它。应该避免在这里使用静态变量,而是先在下面的MainWindow.xaml.cs代码中实例化App class,并将那里的变量用作var app = Application.Current as App; app.myVariable = "Some Value";。我在一些地方读到(比如这里(generally,我们应该避免使用静态变量。

应用程序.xaml.cs

public partial class App : Application
{
private static string myVarialbe {get; set;}
...........
}

主窗口.xaml.cs

public partial class MainWindow : Window
{
..........
private void btnUserUpdate_Click(object sender, RoutedEventArgs e)
{
App.myVariable = "Some value";
......
}
}

作为Clemens答案的补充,我更喜欢以下方式:

public partial class App : Application
{
public static App Me => ((App) Application.Current);
public string MyProperty1 { get; set; }
public int MyProperty2 { get; set; }
public void DoSomething() { }
...
}

这样你就不必到处写选角的东西了。你现在可以简单地写这样的代码:

App.Me.MyProperty1 = "some value";
App.Me.MyProperty2 = 5;
App.Me.DoSomething();

由于App不是静态类,并且该类的实例已经可以通过静态Application.Current属性访问,因此不需要将其任何属性声明为static。

相反,声明非静态属性,如

public partial class App : Application
{
public string MyProperty { get; set; }
...
}

并像这样访问它们:

((App)Application.Current).MyProperty = "Some value";

注意,应避免在不检查null结果的情况下使用as运算符,如

var app = Application.Current as App;
app.MyProperty = "Some Value";

因为这将导致NullReferenceException,而不是InvalidCastException,这是在强制转换操作失败时您实际想要得到的。

as可能有效返回null的潜在情况下,测试它:

var app = Application.Current as App;
if (app != null)
{
app.MyProperty = "Some Value";
}

最新更新