C# 属性和内部viewmodel属性的复合绑定未触发

C# 属性和内部viewmodel属性的复合绑定未触发,c#,.net,silverlight,windows-phone-7,C#,.net,Silverlight,Windows Phone 7,我已经为我的主视图模型创建了一个属性“IsLoading”。其思想是,每当此属性设置为true时,就会显示progressbar。到目前为止还不错 问题是,我有一个调用另一个viewmodel的命令(代码就在那里,因为它是另一个页面上的一个功能,但我希望能够从我的主viewmodel中为它设置快捷方式) 因此,我继续将主属性修改为如下内容: public const string IsLoadingPropertyName = "IsLoading"; private bool

我已经为我的主视图模型创建了一个属性“IsLoading”。其思想是,每当此属性设置为true时,就会显示progressbar。到目前为止还不错

问题是,我有一个调用另一个viewmodel的命令(代码就在那里,因为它是另一个页面上的一个功能,但我希望能够从我的主viewmodel中为它设置快捷方式)

因此,我继续将主属性修改为如下内容:

public const string IsLoadingPropertyName = "IsLoading";

        private bool _isLoading;

        public bool IsLoading
        {
            get
            {
                return _isLoading || ((ViewModelLocator)Application.Current.Resources["Locator"]).SettingsViewModel.IsLoading;
            }
            set
            {
                if (value != _isLoading)
                {
                    _isLoading = value;
                    RaisePropertyChanged(IsLoadingPropertyName);
                }
            }
        }
还有xaml

 <shell:SystemTray.ProgressIndicator>
        <shell:ProgressIndicator IsIndeterminate="true" IsVisible="{Binding Main.IsLoading, Source={StaticResource Locator}}" />
    </shell:SystemTray.ProgressIndicator>
在“设置”视图模型中:

public RelayCommand GetCurrentLocationCommand
        {
            get
            {
                Action getLocation = () =>
                {
                    if (!NetworkInterface.GetIsNetworkAvailable())
                    {
                        return;
                    }

                    var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);
                    watcher.PositionChanged += WatcherPositionChanged;
                    IsLoading = true; // settings view model "IsLoading" propertychanged raising property
                    watcher.Start();
                };
                return new RelayCommand(getLocation);
            }
        }

您正在查看MainViewModel的isLoading属性,以确定是否显示progressbar。Silverlight使用NotifyPropertyChanged事件来确定何时应该重新评估某个属性。设置SettingsViewModel的IsLoading属性或MainViewModel的属性时,您只会引发该ViewModel的changedEvent。你应该为这两个都提高ChangedEvent

修改后的setter示例可能是(取决于公开的方法)


请注意,许多MVVM框架提供了一种称为消息传递的功能,这是在不创建您现在创建的严格依赖关系的情况下进行跨视图模型通信的理想选择。或者,您可以使用全局使用的IsLoading属性。

我明白了。使其正常工作,但情况正好相反(从设置viewmodel提升主viewmodel的设置)
public RelayCommand GetCurrentLocationCommand
        {
            get
            {
                Action getLocation = () =>
                {
                    if (!NetworkInterface.GetIsNetworkAvailable())
                    {
                        return;
                    }

                    var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);
                    watcher.PositionChanged += WatcherPositionChanged;
                    IsLoading = true; // settings view model "IsLoading" propertychanged raising property
                    watcher.Start();
                };
                return new RelayCommand(getLocation);
            }
        }
set 
{ 
    if (value != _isLoading) 
    { 
        _isLoading = value; 
        RaisePropertyChanged(IsLoadingPropertyName); 
        ((ViewModelLocator)Application.Current.Resources["Locator"]).SettingsViewModel.RaisePropertyChanged(IsLoadingPropertyName);
    } 
}