我有一个全局属性,我希望能够从我的解决方案的多个位置访问。我有一个类似这样的ViewModel:
public class GlobalSettingsViewModel : ViewModelBase
{
/// Bool is true if simple mode is activated
private bool isSimpleModeActive;
/// <summary>
/// Gets the IsSimpleModeActive property
/// </summary>
public bool IsSimpleModeActive
{
get
{
return isSimpleModeActive;
}
set
{
if (isSimpleModeActive == value) { return; }
isSimpleModeActive = value;
RaisePropertyChanged("IsSimpleModeActive");
}
}
现在我想知道是否可以向我的app.xaml添加一个ResourceDictionary,以便能够从多个地方访问此viewmodel的属性,而不必一直通过它。
<Application x:Class="AcpCommander.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary... />
</Application.Resources>
然后我如何将该属性绑定到我的视图?现在我有一个像这样的bool绑定的复选框:
<CheckBox Grid.Row="0"
Content="Activate simple mode"
IsChecked="{Binding IsSimpleModeActive}" />
如何绑定app.xaml资源的属性? 感谢您的帮助。
答案 0 :(得分:0)
看看MVVM灯。
在app.xaml
中,它声明了ViewModelLocator
类型的资源。此对象公开属性以全局方式访问各种ViewModel。因为它是一个资源,你可以从xaml文件绑定它。
<Grid DataContext={Binding Path=MyViewModel, Source={StaticResource ViewModelLocator}}
...more here...>
它也会使用依赖注入,但这是可选的,你不必担心它,如果你不知道它是什么(但我强烈建议你去了解它)。
实际上,使用资源公开虚拟机没有问题。
答案 1 :(得分:0)
现在我想知道是否可以向我的app.xaml添加一个ResourceDictionary,以便能够从多个地方访问此viewmodel的属性,而不必一直通过它。
你可以这样做,除非你真的知道自己在做什么,否则这通常是一个坏主意。 (绑定到它的方式是使用Source=StaticResource
,如IsChecked="{Binding Source={StaticResource GlobalSettingsViewModel},Path=IsSimpleModeActive}" />
中所示。)这与全局变量相关的问题相同 - 您可以很快失去对引用的其他对象的范围和生命周期的控制全局的;你失去了封装;你很容易引入内存泄漏。
所以,最好避免 - 我同意@Sheridan,你应该根据需要公开每个视图模型中的各种设置。然后从视图模型中引用设置。你可以通过使用全局/静态来实现这一点,尽管你会遇到一些相同的风险;我建议将一个设置包装类注入需要访问的视图模型中。这可能会提前做一些工作,但从长远来看,希望可以省去一些麻烦。