Я должен разместить 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>();
}
}