Pregunta

I am searching for simple way to show usercontrol when diffrent ribbontab is selected.

This is my xaml:

<ribbon:RibbonWindow x:Class="msr.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        xmlns:msrlib="clr-namespace:msrlib;assembly=msrlib"
        xmlns:msrui="clr-namespace:msr.View.Controls"
        msrlib:DialogService.IsRegisteredView="True"
        Title="MainWindow" 
        Height="700" 
        Width="1260"
        MaxHeight="700"
        MaxWidth="1260">

    <DockPanel>
        <ribbon:Ribbon DockPanel.Dock="Top" Title="App">
            <ribbon:RibbonTab Header="Tab1" IsSelected="True">
                <ribbon:RibbonGroup>
                    <ribbon:RibbonToggleButton IsChecked="True" Command="{Binding ChangeAnalisysView}" CommandParameter="Analisys" SmallImageSource="Images\en\ribbon_button_jan16.png" LargeImageSource="Images\en\ribbon_button_jan32.png" Label="Label1"/>
                    <ribbon:RibbonToggleButton Command="{Binding ChangeAnalisysView}" CommandParameter="AnalisysZestawienieUmow" SmallImageSource="Images\en\ribbon_button_jan16.png" LargeImageSource="Images\en\ribbon_button_jan32.png" Label="Label2"/>
                </ribbon:RibbonGroup>
            </ribbon:RibbonTab>
            <ribbon:RibbonTab Header="Użytkownicy" x:Name="Users">
                <ribbon:RibbonGroup>
                    <ribbon:RibbonButton Command="{Binding UsersViewModel.AddUserCommand}" SmallImageSource="Images\en\ribbon_button_jan16.png" LargeImageSource="Images\en\ribbon_button_jan32.png" Label="Nowy użytkownik"/>
                    <ribbon:RibbonButton Command="{Binding UsersViewModel.EditUserCommand}" SmallImageSource="Images\en\ribbon_button_jan16.png" LargeImageSource="Images\en\ribbon_button_jan32.png" Label="Edytuj"/>
                    <ribbon:RibbonButton Command="{Binding UsersViewModel.DeleteUserCommand}" SmallImageSource="Images\en\ribbon_button_jan16.png" LargeImageSource="Images\en\ribbon_button_jan32.png" Label="Usuń"/>
                </ribbon:RibbonGroup>
            </ribbon:RibbonTab>
        </ribbon:Ribbon>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <ContentControl Visibility="{Binding CurrentView, Converter={StaticResource StringToVisibilityConverter}, ConverterParameter=Analisys}">
            <msrui:Analysis Grid.Row="0" DataContext="{Binding AnalisysViewModel}"/>
            </ContentControl>

            <ContentControl Visibility="{Binding CurrentView, Converter={StaticResource StringToVisibilityConverter}, ConverterParameter=Users}">
                <msrui:Users Grid.Row="0" DataContext="{Binding UsersViewModel}"/>
            </ContentControl>

            <ContentControl Visibility="{Binding CurrentView, Converter={StaticResource StringToVisibilityConverter}, ConverterParameter=AnalisysZestawienieUmow}">
                <msrui:AnalisysZestawienieUmow Grid.Row="0" DataContext="{Binding AnalisysZestawienieUmowViewModel}"/>
            </ContentControl>
        </Grid>
    </DockPanel>
</ribbon:RibbonWindow>

And my MainWindowViewModel:

class MainWindowViewModel : ViewModelBase
{
    //TODO ICommand for navigation
    public MainWindowViewModel()
    {
        HideWorkspace = true;
        AnalisysViewModel = new Analisys();
        UsersViewModel = new UsersViewModel();
        AnalisysZestawienieUmowViewModel = new AnalisysZestawienieUmow();
        CurrentView = "Analisys";
    }


    public Analisys AnalisysViewModel { get; private set; }
    public UsersViewModel UsersViewModel { get; private set; }
    public AnalisysZestawienieUmow AnalisysZestawienieUmowViewModel { get; private set; }
    public string CurrentView { get; set; }
}

I planned to use "CurrentView" for setting visibility of usercontrols that should be shown. For this I am using my own StringToVisibilityConverter:

public class StringToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = value as string;

        if (string.IsNullOrEmpty(s)) {
            return Visibility.Collapsed;
        };

        //value is not empty
        string param = (string)parameter;
        //no param, show
        if (string.IsNullOrEmpty(param))
        {
            return Visibility.Visible;
        }

        //got param
        if (s == param) return Visibility.Visible;

        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

ribbon:RibbonToggleButton has Command property, so I can create ICommand in main viewmodel and set CurrentView property. I have no idea how to create similar command for RibbonTab.

¿Fue útil?

Solución

Bind the RibbonTab's IsSelected property to a property in the ViewModel:

public bool Tab1Selected { 
    get { return tab1Selected; } 
    set { tab1Selected = value; 
          if (tab1Selected) {    
              CallMyMthod(); 
        } 
    } 
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top