Почему Binding Visibility в этом случае не работает с RibbonPages? - PullRequest
0 голосов
/ 20 марта 2019

Я должен разместить 2 пользовательских элемента управления в 1 окне с возможностью их переключения. Я достигаю этого с помощью RibbonPages в RibbonControl и устанавливаю видимость через привязку в MainWindow.xaml со свойствами в MainViewModel.

Я не получаю никакой ошибки. Но видимость работает правильно, и UserControl_1 отображается, только если я установил <components:UserControl_1 Grid.Row="1" Visibility="Visible"/> direct в MainWindow без привязки. В противном случае UserControl_2 всегда отображается.

Я вижу в Debugger, что при изменении RibbonPage вызывается функция SelectedPageChanged() и переключаются свойства видимости в MainVM. Так что теоретически это должно сработать.

Надеюсь, мои объяснения понятны.

Вот мой код:

Ribbon.xaml

<UserControl x:Class="Ribbon"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:dxr="http://schemas.devexpress.com/winfx/2008/xaml/ribbon"
            xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
            xmlns:dxc="http://schemas.devexpress.com/winfx/2008/xaml/core"
            xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
            xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
            mc:Ignorable="d" 
            DataContext="{Binding Ribbon, Source={StaticResource Locator}}"
            d:DesignHeight="50" d:DesignWidth="1024"            
             >
<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

<dxr:RibbonControl x:Name="RibbonControl" Grid.Row="0"
                           SelectedPageChanged="RibbonControl_SelectedPageChanged">
<dxr:RibbonDefaultPageCategory>
                <dxr:RibbonPage Caption="User Control1" Name="UserControl1"/>
                <dxr:RibbonPage Caption="User Control2" Name="UserControl2"/>
</dxr:RibbonDefaultPageCategory>
</dxr:RibbonControl>
    </Grid>
</UserControl>

Ribbon.xaml.cs

public partial class Ribbon
    {
        public static RibbonViewModel RibbonVm;
        public Ribbon()
        {
            InitializeComponent();
            RibbonVm = DataContext as RibbonViewModel;            
        }

        private void RibbonControl_SelectedPageChanged(object sender, RibbonPropertyChangedEventArgs e)
        {
            if (Globals.MainVm == null) Globals.MainVm = SimpleIoc.Default.GetInstance<MainViewModel>();
                if (((RibbonPage)e.NewValue).Name == "UserControl2")
            {
                Globals.MainVm.UserControl_1_Visibility = Visibility.Collapsed;
                Globals.MainVm.UserControl_2_Visibility = Visibility.Visible;
            }
            else
            {
                Globals.MainVm.UserControl_1_Visibility = Visibility.Visible;
                Globals.MainVm.UserControl_2_Visibility = Visibility.Collapsed;
            }           
        }
        }

Globals.MainVm является статическим свойством MainViewModel для static class Globals

MainViewModel

 public class MainViewModel : DevExpress.Mvvm.ViewModelBase
    {
        private Visibility _userControl_1_Visibility = Visibility.Visible;
        private Visibility _userControl_2_Visibility = Visibility.Hidden;


        public Visibility UserControl_1_Visibility
        {
            get { return __userControl_1_Visibility; }
            set
            {
                __userControl_1_Visibility= value;
                RaisePropertyChanged();
            }
        }

        public Visibility UserControl_2_Visibility
        {
            get { return __userControl_2_Visibility; }
            set
            {
                __userControl_2__Visibility= value;
                RaisePropertyChanged();
            }
        }        
    }

Я использую DevExpress.Mvvm.BindableBase.RaisePropertiesChanged

MainWindow.xaml

        <components:Ribbon Grid.Row="0" />
        <components:UserControl_1 Grid.Row="1" Visibility="{Binding UserControl_1_Visibility}"/>
        <components:UserControl_2 Grid.Row="1" Visibility="{Binding UserControl_2_Visibility}"/>

MainWindow.xaml.cs

 public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = SimpleIoc.Default.GetInstance<MainViewModel>();
       }
    }
...