Wpf contentControl
Neuen Programmierer Frage:
Ich bin versucht, zu erstellen eine einfache navigation willkommen Seite ähnlich wht Sie whould zu sehen auf einem ipad.
Mein Hauptfenster hat eine Titelleiste, (die sich nicht ändern) und der rest wird ein container sortiert wird zeigen, dass verschiedene Dinge, die basierend auf Ereignissen.
So, hier ist meine Frage wie kann ich binden den container (contentcontrol) zu zeigen, andere Ansichten ie zeigen welcomeview ursprünglich und dann, wenn ein Benutzer klicken Sie auf eine Schaltfläche aus der willkommen-Ansicht die content-Steuerelement zeigt die Ansicht, die Sie ausgewählt.
Ich derzeit die Seite Willkommen als:
<UserControl x:Class="ContentControl.Views.WelcomeView"
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:ContentControl.ViewModels"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<vm:WelcomeViewModel />
</UserControl.DataContext>
<Grid Background="red">
<Grid.RowDefinitions >
<RowDefinition Height="25*" />
<RowDefinition Height="50*"/>
<RowDefinition Height="25*"/>
</Grid.RowDefinitions>
<Rectangle Grid.Row="0" Fill="Green"/>
<DockPanel Grid.Row="1" HorizontalAlignment="Center" Background="White">
<Button Height="50" Width="50" Margin="5" Content="DASH" Command="{Binding ViewChangedCommand}" CommandParameter="Dashboard"/>
<Button Height="50" Width="50" Margin="5" Content="ROOM" Command="{Binding ViewChangedCommand}" CommandParameter="MeetingRoom"/>
<Button Height="50" Width="50" Margin="5" Content="SCREEN" Command="{Binding ViewChangedCommand}" CommandParameter="Screen" />
</DockPanel>
<Rectangle Grid.Row="2" Fill="Blue"/>
</Grid>
</UserControl>
ViewModel ist wie folgt:
class WelcomeViewModel : BaseViewModel
{
private MainWindowViewModel _mainWindowVm;
private RelayCommand<string> _viewChangedCommand;
public ICommand ViewChangedCommand
{
get { return _viewChangedCommand ?? (_viewChangedCommand = new RelayCommand<string>(OnViewChanged)); }
}
public event EventHandler ViewChanged;
private void OnViewChanged(string view)
{
EventHandler handler = ViewChanged;
if (handler != null) handler(view, EventArgs.Empty);
}
public MainWindowViewModel MainWindowVm
{
get { return _mainWindowVm; }
set
{
_mainWindowVm = value;
OnPropertyChanged("MainViewModel");
}
}
public WelcomeViewModel()
{
MainWindowVm = new MainWindowViewModel();
ViewChanged += MainWindowVm.ViewChanged;
}
}
}
Und ich habe mein Hauptfenster wie folgt:
<Window x:Class="ContentControl.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ContentControl.ViewModels"
xmlns:views="clr-namespace:ContentControl.Views"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="{x:Type vm:ScreenViewModel}">
<views:ScreenView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:WelcomeViewModel}">
<views:WelcomeView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:MeetingRoomViewModel}">
<views:MeetingRoomView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:DashboardViewModel}">
<views:DashboardView />
</DataTemplate>
</Window.Resources>
<Grid>
<StackPanel>
<Label>This Is My Label</Label>
<ContentControl x:Name="MainPanel" Content="{Binding Content, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
MinHeight="200"
MinWidth="200"
HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
Focusable="False">
</ContentControl>
</StackPanel>
</Grid>
</Window>
Hauptfenster Anzeigen Modell:
class MainWindowViewModel : BaseViewModel
{
private UserControl _content;
public UserControl Content
{
get { return _content; }
set
{
_content = value;
OnPropertyChanged("Content");
}
}
public void ViewChanged(object o, EventArgs e)
{
switch (o.ToString())
{
case "Welcome":
{
var welcome = new WelcomeView();
Content = welcome;
break;
}
case "MeetingRoom":
{
var meetingRoom = new MeetingRoomView();
Content= meetingRoom;
break;
}
case "Dashboard":
{
var dashboard = new DashboardView();
Content = dashboard;
break;
}
case "Screen":
{
var screen = new ScreenView();
Content = screen;
break;
}
}
MessageBox.Show(o.ToString());
}
public MainWindowViewModel()
{
}
}
}
Wie kann ich dies dann mit einander arbeiten, So kann ich zeigen, die WelcomeView, wie der Inhalt des contentcontrol und wenn ich dann eine Taste drücken, haben die ContentControl ändern, was ausgewählt wurde.
Nochmal sorry, ich bin neu zu MVVM und WPF-und diese verbindlich sind messing mit meinem Kopf.
InformationsquelleAutor KitWat | 2012-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tasten STRICH, ZIMMER, BILDSCHIRM, sollte auf das MainWindow. Die ViewChangedCommand sollte auf das MainWindowViewModel. Die Inhalte und zeigte sich von dynamischen templates.
Wenn Sie die Tasten auf dem regler:
Ok, also, dann lassen wir die Tasten auf die Steuerelemente, aber die änderung-Inhalt Befehl sollte im MainWindowViewModel. Um eine Bindung wie diese sollten Sie so etwas tun:
in Ihre Tasten
Ok, also, dann lassen wir die Tasten auf die Steuerelemente, aber die änderung-Inhalt Befehl sollte im MainWindowViewModel. Um eine Bindung wie diese sollten Sie so etwas tun
Aber ich denke, dass dies könnte einige redundante code. Sie müssen möglicherweise blogal Schaltflächen auf dem Hauptfenster, und auch die Steuerelemente definieren könnte, die ihrigen eigene Tasten
Sie haben die ViewChangedCommand in Ihrem WelcomeViewModel, und sollten im MainWindowViewModel, dann die Tasten in Ihrer Kontrolle haben sollte, die so Verbindlich ist wie ein Sprach-Foto in oben genannter. Es ist jetzt klar? Bitte sagen, wenn nicht.
Die Bindung, die ich schrieb dosent Arbeit? Hast du das MainWindow.DataContext = new MainWindowViewModel()?
InformationsquelleAutor Raúl Otaño