我遇到更新我正在處理的Windows Phone 7應用程序接口的問題。從另一個視圖模型調用函數時,RaisePropertyChanged不會觸發
我有一個MainPage.xaml
及其MainViewModel.cs
它處理子視圖usercontrol ChildView1.xaml
如何出現在MainPage中。 ChildView1也有它的ViewModel,它是Child1ViewModel.cs
。基本上,一個myToggleButton
被從MainPage觸發,這將觸發DataStateBehavior
進入顯示或隱藏狀態,分別顯示或隱藏ChildView1.xaml
。 DataStateBehavior被綁定到布爾CanShowView
,而myToggleButton
被綁定到名爲ButtonChecked
的Icommand
,後者具有中繼功能SwitchVisibility
,該功能將反轉CanShowView
布爾值以顯示或隱藏視圖。所有作品都很好,這要歸功於我使用的MVVM燈的RaisePropertyChanged
。
然而,ChildView1.xaml
具有應該調用從MainViewModel的SwitchVisibility
功能這又將恢復的CanShowView
和CanShowView
的RaisePropertyChanged
應該解僱有ChildView1
接近一個myCloseButton
,但問題是,鑑於保持可見和從不關閉,出於某種原因!我通過調試器注意到CanShowView
中的RaisePropertyChanged
似乎不能啓動。我想這就是問題所在。我做錯了什麼?我該如何強制它開火?我使用了多個RaisePropertyChanged
,但即使脫脂劑顯示我的功能中的值確實發生了變化,但似乎沒有任何火災發生。
這是我的代碼。 MainPage.xaml中:
<phone:PhoneApplicationPage
...
>
<phone:PhoneApplicationPage.DataContext>
<Binding Path="Main" Source="{StaticResource Locator}"/>
</phone:PhoneApplicationPage.DataContext>
...
<Grid x:Name="LayoutRoot">
...
<ToggleButton x:Name="myToggleButton" Command="{Binding Main.ButtonChecked, Source={StaticResource Locator}}" >
<local:ChildView1 x:Name="myChildView1" Grid.Row="0" RenderTransformOrigin="0.5,0.5">
<i:Interaction.Behaviors>
<ec:DataStateBehavior Binding="{Binding Main.CanShowView, Source={StaticResource Locator}}" Value="True" TrueState="showChildView1" FalseState="hideChildView1"/>
</i:Interaction.Behaviors>
<local:ChildView1.RenderTransform>
<CompositeTransform/>
</local:ChildView1.RenderTransform>
</local:ChildView1>
</Grid>
</phone:PhoneApplicationPage>
MainViewModel.cs:
public class MainViewModel : ViewModelBase
{
public ICommand ButtonChecked { get; private set; }
public MainViewModel()
{
ButtonChecked = new RelayCommand(() => SwitchVisibility());
}
public void SwitchVisibility()
{
CanShowView = !CanShowView;
RaisePropertyChanged("CanShowView");
}
bool _canShowView = true;
public bool CanShowView
{
get { return _canShowView; }
set
{
if (value != _canShowView)
{
_canShowView = value;
RaisePropertyChanged("CanShowView");
}
}
}
}
ChildView1.xaml:
<UserControl x:Class="myApp.Views.ChildView1"
....
DataContext="{Binding Child1VM, Source={StaticResource Locator}}"
>
<Grid x:Name="HomeGrid">
<Button x:Name=myCloseButton Command="{Binding Child1VM.CloseChildViewCmd, Source={StaticResource Locator}}"/>
...
</Grid>
</UserControl>
Child1ViewModel.cs:
namespace myApp
{
public class Child1ViewModel : ViewModelBase
{
public ICommand CloseChildViewCmd { get; private set; }
public Child1ViewModel()
{
CloseChildViewCmd = new RelayCommand(() => ExecuteCloseChildViewCmd());
}
public void ExecuteCloseChildViewCmd()
{
MainPage mainPage = new MainPage();
MainViewModel mainVM = new MainViewModel();
mainPage.DataContext = mainVM;
mainVM.SwitchVisibility();
}
}
}
注:我只初學者p程序員,所以我解決問題的方式或程序本身可能是有問題的,因此我願意接受任何建議,並且代碼示例非常受歡迎。在做了大量研究和嘗試了許多似乎無法工作的事情後,我一直堅持這個問題很多天了。我花時間詳細寫下了這個問題,我真的很希望我能在這裏找到解決方案。如果有更多的細節需要知道,請告訴我。 在此先感謝。
編輯:我讀了創建視圖的新實例不是解決方案。我還能如何訪問MainView
的函數並提升屬性?
編輯:正如OmegaMan所建議的,我使用靜態定義來調用我的函數。 所以更新MainViewModel.cs
: public class MainViewModel:ViewModelBase { public ICommand ButtonChecked {get;私人設置; } private static MainViewModel Primary {get;組; }
public MainViewModel()
{
ButtonChecked = new RelayCommand(() => SwitchVisibility());
Primary = this;
}
public void SwitchVisibility()
{
CanShowView = !CanShowView;
RaisePropertyChanged("CanShowView");
}
public static void SwitchViewStatic()
{
Primary.SwitchVisibility();
}
bool _canShowView = true;
public bool CanShowView
{
get { return _canShowView; }
set
{
if (value != _canShowView)
{
_canShowView = value;
RaisePropertyChanged("CanShowView");
}
}
}
}
更新Child1ViewModel.cs
: 命名空間對myApp { 公共類Child1ViewModel:ViewModelBase { 公衆的ICommand CloseChildViewCmd {獲得;私人設置; } public Child1ViewModel() { CloseChildViewCmd = new RelayCommand((=)ExecuteCloseChildViewCmd()); }
public void ExecuteCloseChildViewCmd()
{
MainViewModel.SwitchViewStatic();
}
}
}
在MainViewModel所需的功能得到由myCloseButton從子視圖調用,但仍然CanShowView
不會得到提高到允許DataStateBehavior聽着它,更新UI ...所以我仍然無所事事。
其中MVVM框架靜態方法訪問? –