2013-09-27 39 views
1

我的班级代表了我的AppSettings 我有Main窗口和Settings窗口。在WPF中的两个窗口之间共享同一个对象

每个窗口包含对象AppSettings

的实例所以这是两个对象是不同的。 如果对象AppSettingsSettings窗口被更改,则更改不会反映在Main窗口的AppSettings中。

有没有什么办法可以共享AppSettings windows之间的对象,所以我只有一个实例?

我试图创建共享的基类,但得到了一个错误

Partial declarations of "class name" must not specify different base classes  

回答

1

有什么办法,我可以分享的AppSettings对象的窗口之间,所以我只有一个实例?

你需要一些方法让两个窗口获得相同的参考。如果您将同一个AppSettings对象的引用传递给两个Windows,则这应该是正常的。

+0

我试图做到这一点通过从'System.Windows继承基类。窗口“,但没有办法 – Sreginogemoh

+0

@Sreginogemoh这只会在你使用单个静态变量时起作用,但通常将这些传递给Window的构造函数或设置属性等效果更好。 –

2

您可以在一个类中创建静态属性,并在其他类的该静态属性上创建包装属性。

此外,如果你将这个属性绑定到你的UI,那么你不需要两个propeties ..你可以绑定到静态实例。

0

你可以像“utils的”一类在你的项目中包含一个属性:

Public Shared(or Static in C#) AppSettings As YourObjectType 

然后在窗口的XAML让与Utils.AppSetings一个在模式结合双向

+0

它们是独立的类 – Sreginogemoh

+0

答案编辑,我想现在你可以使用它。 – Alexandre

0

当然有。您可以在两个窗口DependencyProprerties中创建AppSettings属性,然后在创建Settings窗口时将Settings中的属性绑定到Main窗口的属性。也就是说,在SettingsWindow类:

partial class SettingsWindow : Window { 

    public static readonly DependencyProperty AppSettingsProperty("AppSettings", typeof(AppSettings), typeof(SettingsWindow), new PropertyMetaData(null)); 

    public AppSettings AppSettings { 
     get { return (AppSettings) GetValue(AppSettingsProperty); } 
     set { SetValue(AppSettingsProperty, value); } 
    } 

} 

然后,在Main窗口类的代码背后:

partial class MainWindow : Window { 

    public static readonly DependencyProperty AppSettingsProperty("AppSettings", typeof(AppSettings), typeof(MainWindow), new PropertyMetaData(null)); 

    public AppSettings AppSettings { 
     get { return (AppSettings) GetValue(AppSettingsProperty); } 
     set { SetValue(AppSettingsProperty, value); } 
    } 

    private void ShowSettingsWindowButton_Click(object sender, RoutedEventArgs e) { 
     SettingsWindow settingsWindow = new SettingsWindow(); 
     Binding appSettingsBinding = new Binding("AppSettings"); 
     appSettingsBinding.Source = this; 
     appSettingsBinding.Path = new PropertyPath("AppSettings"); 
     appSettingsBinding.Mode = BindingMode.TwoWay; 
     BindingOperations.SetBinding(this, AppSettingsProperty, appSettingsBinding); 
     settingsWindow.ShowDialog(); 
    } 
} 

Binding机制将保持性能的两个对象同步。因此,如果在SettingsWindow处于打开状态时用一个不同实例替换一个类中的属性值,则会通知SettingsWindows该更改并更新其副本。

1

我知道这个答案对主题有影响,但是我发现了其他更简单的方法来完成问题,以便将来可以帮助任何人。 在每个WPF应用程序中都创建了app.xaml和app.xaml.cs。 因此,在app.xaml中创建一个设置对象。CS,它会是这个样子:

namespace WpfApplication 
{  
    public partial class App : Application 
    { 
     // Settings : 
     public int setting_1 { get; set; } //some setting variable 
     public string setting_2 { get; set; } //some other setting variable 
    } 
}  

我们指的是从不同的窗口这个对象可以使用:((App)Application.Current).setting_1

相关问题