我在更新我正在使用的 Windows Phone 7 应用程序的界面时遇到问题。
我有一个MainPage.xaml
及其MainViewModel.cs
处理子视图用户控件如何ChildView1.xaml
出现在 MainPage 中的方法。ChildView1 也有它的 ViewModel,它是Child1ViewModel.cs
. 基本上 amyToggleButton
从 MainPage 触发,这将触发 aDataStateBehavior
进入显示或隐藏状态以分别显示或隐藏ChildView1.xaml
. DataStateBehavior 绑定到布尔值CanShowView
,而myToggleButton
绑定到具有中继功能的Icommand
命名,该函数将反转布尔值以显示或隐藏视图。多亏了我使用的 MVVM 灯,一切都很好。ButtonChecked
SwitchVisibility
CanShowView
RaisePropertyChanged
然而,ChildView1.xaml
有一个myCloseButton
应该从 MainViewModel 调用该SwitchVisibility
函数的函数,这反过来又会恢复CanShowView
和RaisePropertyChanged
inCanShowView
应该触发以ChildView1
关闭,但问题是视图保持可见并且由于某种原因永远不会关闭!我通过调试器注意到RaisePropertyChanged
inCanShowView
似乎没有触发。我想这就是问题所在。我做错了什么?我怎样才能强迫它开火?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();
}
}
}
注意:我只是一个初学者程序员,所以我解决问题的方式或程序本身可能是有问题的,因此我愿意接受任何建议,并且非常欢迎代码示例。在进行了大量研究并尝试了许多似乎从未奏效的事情之后,我已经被这个问题困扰了很多天。我花时间详细写了这个问题,我真的希望我能在这里找到解决方案。如果您需要了解更多详细信息,请告诉我。提前致谢。
编辑:我读到创建视图的新实例不是解决方案。我还能如何访问 fireMainView
的功能并提高属性?
编辑:正如 OmegaMan 所建议的,我正在使用静态定义来调用我的函数。所以更新了MainViewModel.cs
: public class MainViewModel : ViewModelBase { public ICommand ButtonChecked { get; 私人套装;} 私有静态 MainViewModel 主要 { 获取;放; }
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 { public class Child1ViewModel : ViewModelBase { public ICommand CloseChildViewCmd { get; 私人套装;} public Child1ViewModel() { CloseChildViewCmd = new RelayCommand(() => ExecuteCloseChildViewCmd()); }
public void ExecuteCloseChildViewCmd()
{
MainViewModel.SwitchViewStatic();
}
}
}
MainViewModel 中所需的函数由 myCloseButton 从子视图调用,但CanShowView
仍然不会被提升以允许 DataStateBehavior 监听它,更新 UI ......所以我仍然处于僵局。