崩壊の可視UserControlsにButtonClickとョなスワップ機構
-
21-09-2019 - |
質問
私のシナリオをいMainView+MainViewModel,UserControl1+UserControl2.のMainViewって2つのボタンで操作:Button_ShowUserControl1+Button_ShowUserControl2.下部のMainViewい"ContentGrid"か/should_take...毎UserControl.
私の目標:
時Button_ShowUserControl1をクリック UserControl1 は 可視 や UserControl2 または その他のUserControlするようになっている必要があ 崩壊.同一の有効期限はButton_ShowUserControl2.
私の問題:
1.) としてのUserControlsは、ロードアプリケーション開始かけることはできませんのひとつ"ContentGrid"?私が実際にできません...今年から一UserControl見えるが、その他の場所"ContentGrid"で崩壊?
2.) として1.) そうできないかインスタンス化すべてのUserControlsでアプリケーションの開始しか見えない閉時それぞれボタンをクリック?
3.) としてUserControlは開放的なオフィス環境をご利用頂=見える表示/折りたたみたいのですが結合するホテルグランドパレスのすぐ横にViewModel返すなどのような値崩壊?私はみ出することができるboolean値のように視認性=false/でしょうか?
私testcode:
<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;
}
}
}
あり、コードが間違っていない。)
解決
ただ2つのものを誤ったこのコードです。
1)で設定できないの視認性のusercontrol直---すでにコンテナ:
<Grid Visibility="Collapsed">
<myControls:MyUserControl />
</Grid>
2)視認性はboolean型の値では、enum.こうして使いこなせるよう、最低限必要なaコンバーター変換からbooleanを利用します。観測:
<Window ...>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
</Window.Resources>
<Grid Visibility="{Binding ShouldShowUsercontrol1, Converter={StaticResource BoolToVis}}">
<myControls:MyUserControl />
</Grid>
</Window>
すべきです。武器agiは、dexで下がらないboxerぐ.
ありその他のものをいくつかのに影響を与える可能性のある能力のことです。例えば、い最大のコンテナ素子...い包装すStackPanel?の場合は包装ですべてのグリッドは、例えば、コントロールシステムはオーバーレイのすべます。
みこれらの変化をご提案いたし...で取得しました。
編集:もうひとつのデータをテンプレート
別のものになにができるのはいただくには独自のViewModel毎にこれらのビューしたい表示と非表示を切り替え:
public class MyFirstViewModel : ViewModel
{
}
public class MySecondViewModel : ViewModel
{
}
それから"親会社"又は"主"ViewModel、表示/非表示にしたいようしてコレクションの中のViewModels:
public MyMainViewModel : ViewModel
{
public ObservableCollection<ViewModel> ViewsToShow
{
...
}
public void ShowFirstViewModel()
{
ViewsToShow.Add(new MyFirstViewModel());
}
}
ワイヤーもにおいしdatatemplateこれらの種類をユーザーコントロールがこのような原因を考へのインスタンスが生成されない限りが必要になった:
<Window ...>
<Window.Resources>
<DataTemplate DataType="{x:Type myViewModels:MyFirstViewModel}">
<myViews:MyFirstView />
</DataTemplate>
<DataTemplate DataType="{x:Type myViewModels:MySecondViewModel}">
<myViews:MySecondView />
</DataTemplate>
</Window.Resources>
<ItemsControl ItemsSource="{Binding ViewsToShow}" />
</Window>
当ViewModelsに入れますので"ViewsToShow"、自動的に見るとテンプレートに適します。まずスをインスタンス化しています。
このう少しクリーナー以外に何もかも単一のものとデニースザメネースパークの設定は視認性が、実際のところに依存する世界発のレザーテニスシューモデルタイプ毎のビューができない。
の保存状態が登場利用の場合はDataTemplatedます。を解決していくことでトレッドおViewModelとしての状態を制御とデザインの両方ViewModelsとお考えます。ここでは一例ですることを可能にするスワップご意見をDataTemplatingが切り替え前後に保存します。
想定の設定から前項w/2viewmodelsるdatatemplates定義されています。変えてみましょう、MainViewModel少:
public MyMainViewModel : ViewModel
{
public RelayCommand SwapViewsCommand
{
...
}
public ViewModel View
{
...
}
private ViewModel _hiddenView;
public MyMainViewModel()
{
View = new MyFirstViewModel();
_hiddenView = new MySecondViewModel();
SwapViewsCommand = new RelayCommand(SwapViewModels);
}
public void SwapViewModels()
{
var hidden = _hiddenView;
_hiddenView = View;
View = hidden;
}
}
数の変化をメイン。私は省略のDataTemplates簡潔.
<Window ...>
<!-- DataTemplates Here -->
<Button Command="{Binding SwapViewsCommand}">Swap!</Button>
<ContentControl Content="{Binding View}" />
</Window>
それだけです。その秘密はこちらんのを参考に独自のビューモデルです。このように、例えばある文字列のプロパティviewmodelおよび関連するテキストボックスのDataTemplated usercontrolと 双方向結合 その後の状態は基本的にすると保存されます。