私のシナリオでは、MainView + MainViewModel、UserControl1 + UserControl 2 があります。MainView には、Button_ShowUserControl1 + Button_ShowUserControl2 というラベルの付いた 2 つのボタンがあります。MainView の下部には、すべての UserControl を取得する「ContentGrid」があります。
私の目標:
Button_ShowUserControl1 がクリックされた場合、 UserControl1はVisibleであり、UserControl2 またはその他の UserControl はCollapsedに設定する必要があります。同じことが Button_ShowUserControl2 にも有効です。
私の問題:
1.) アプリケーションの開始時に UserControls がロードされるため、それらをすべて 1 つの「ContentGrid」にまとめるにはどうすればよいですか? それは実際には不可能です...では、他のユーザーコントロールが同じ場所にあるときに、他のユーザーコントロールを表示するにはどうすればよいですか/「ContentGrid」が折りたたまれているだけですか?
2.) 1.) は不可能のようですが、アプリケーションの開始時にすべての UserControls をインスタンス化し、それぞれのボタンがクリックされたときに表示/折りたたみのみにする方法を教えてください。
3.) UserControl にはプロパティ Visibility = Visible/Hidden/Collapsed があるため、Collapsed のような値を返す ViewModel のプロパティにバインドするにはどうすればよいですか? Visibility = false/true のようなブール値しか取得できませんでしたか?
私のテストコード:
<Grid x:Name="LayoutRoot" Background="#FFBDF5BD" ShowGridLines="False">
<Grid.RowDefinitions>
<RowDefinition Height="96*" />
<RowDefinition Height="289*" />
</Grid.RowDefinitions>
<Grid HorizontalAlignment="Stretch" Name="MenuGrid" VerticalAlignment="Stretch" Background="#FFCECEFF">
<StackPanel Name="stackPanel1" Background="#FFEDFF00" Orientation="Horizontal">
<Button Content="User Data 1" Height="35" Name="button1" Command="{Binding Path=ShowUserControl1Command}" Width="150" Margin="100,0,0,0" />
<Button Content="User Data 2" Height="35" Name="button2" Width="150" Margin="100,0,0,0" />
</StackPanel>
</Grid>
<Grid Grid.Row="1" HorizontalAlignment="Stretch" Name="ContentGrid" VerticalAlignment="Stretch" Background="#FFB15454" />
</Grid>
<UserControl x:Class="SwapUserControls.MVVM.UserControl2"
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:vm="clr-namespace:SwapUserControls.MVVM.ViewModel"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Visibility="{Binding IsUserControl1Collapsed, Path=Value}">
<UserControl.Resources>
<vm:MainViewModel x:Key="MainViewModelID" />
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource MainViewModelID}" />
</UserControl.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="228*" />
<RowDefinition Height="72*" />
</Grid.RowDefinitions>
<Button Content="UserControl2" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="112,27,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
<DataGrid HorizontalAlignment="Stretch" Name="dataGrid1" VerticalAlignment="Stretch" Background="#FFC046F8" />
</Grid>
public class MainViewModel : ViewModelBase
{
RelayCommand _ShowUserControl1Command;
private bool _IsUserControl1Collapsed;
public RelayCommand ShowUserControl1Command
{
get
{
if (_ShowUserControl1Command == null)
{
_ShowUserControl1Command = new RelayCommand( () => ShowUserControl1() );
}
return _ShowUserControl1Command;
}
}
public void ShowUserControl1()
{
_IsUserControl1Collapsed = true;
}
public bool IsUserControl1Collapsed
{
get
{
return _IsUserControl1Collapsed;
}
}
}
はい、コードが間違っているので、ここで質問します:)