ContentControl可见性绑定不起作用

时间:2019-11-08 17:08:31

标签: wpf xaml mvvm binding

我在UserControl中有一个可见性绑定。

<Grid x:Name="_dockPanelMain">

    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <ContentControl Grid.Row="0" cal:RegionManager.RegionName="{x:Static Member=consts:RegionNames.MainMenu}" DockPanel.Dock="Top" Visibility="{Binding MainMenuVisibility, Mode=TwoWay}"/> 
    <ContentControl Grid.Row="0" x:Name="dockManagerModules" cal:RegionManager.RegionName="{x:Static Member=consts:RegionNames.Modules}" Visibility="{Binding ModulesVisibility, Mode=TwoWay}"/>
    <ContentControl Grid.Row="1" x:Name="dockManagerStatusBar" cal:RegionManager.RegionName="{x:Static Member=consts:RegionNames.StatusBar}"/>
</Grid>

此用户控件具有一个ViewModel,其相关部分是

        private void SwitchMenuAndModulViews(object sender)
    {
        if (ModulesVisibility == Visibility.Visible)
        {
            ModulesVisibility = Visibility.Collapsed;
            MainMenuVisibility = Visibility.Visible;
        }
        else
        {
            ModulesVisibility = Visibility.Visible;
            MainMenuVisibility = Visibility.Collapsed;
        }
    }

        private Visibility _modulesVisibility = Visibility.Visible;
    public Visibility ModulesVisibility
    {
        get { return _modulesVisibility; }
        set
        {
            _modulesVisibility = value;
            RaisePropertyChangedEvent(() => ModulesVisibility);
        }
    }

    private Visibility _mainMenuVisibility = Visibility.Collapsed;
    public Visibility MainMenuVisibility
    {
        get { return _mainMenuVisibility; }
        set
        {
            _mainMenuVisibility = value;
            RaisePropertyChangedEvent(() => MainMenuVisibility);
        }
    }

调用SwitchMenuAndModulView时,没有任何反应。变量会更改,但是绑定不起作用,并且两个ContentControl都始终将Visibility设置为Visible,我想这是默认设置,而且它们都没有更改为Collapsed。

1 个答案:

答案 0 :(得分:-1)

已解决:

我自己解决了问题,问题不在于绑定本身,而在于应用程序实例化并显示UserControl的方式。

我有一个UserControl A实例,该UserControl B作为其内容的一部分。自然地,A在创建时创建了B的实例。 后来,我用另一个B实例(使用我的viewModel)替换了A中B的实例,但是我可能忘了告诉视觉树有关更改,因此在视觉上它仍然显示旧的B实例,其绑定未导致任何地方。

我希望应用程序在发生盲绑定(例如,它绑定到未实例化或拼写错误的元素)时抛出异常,而不是只保留默认值。 XAML的这种行为会产生许多错误。