Hallo,
Ich habe bisher viel mit WindowsForms gearbeitet aber da wir nun im Betrieb auf WPF umsteigen (ich bin noch Azubi) habe ich ein kleines Übungsprojekt angelegt.
Ich habe eine View welcher ich aber immer ein Parameter mitgeben (egal welcher) will.
Bisher öffne ich die View mit folgendem Befehl:
ServiceContainer.GetService<INavigationService>().Navigate("DetailView", null, this);
Dort kann ich aber keine Parameter mitgeben..
Ich habe das Problem bisher so gelöst dass ich es einfach mit einer Property aus der MainForm hole..
a = ((MainWindow)(Application.Current.MainWindow)).Test;
So ist das Prinzip aber sicher nicht gewollt..
Wie löse ich das am besten? Hat mir bitte jemand Lösungsvorschläge?
Lieber Gruß,
Steffen
Hallo Steffen555,
herzlich willkommen hier auf myCSharp.de!
Wo genau kommt denn der INavigationService her? 3rd-Party? Eigenentwicklung?
Davon hängt recht stark ab, wie du weiter vorgehen kannst.
Du hast recht: Das ViewModel aus dem MainWindow zu holen ist alles andere als elegant.
Schaue dich einmal um, ob du eventuell das DetailViewModel zunächst erzeugen und erst in einem zweiten Schritt zu ihm hinnavigieren kannst. Dann hättest du direkten Zugriff darauf ohne irgendwelche Umwege.
Hallo,
Danke für die Antwort!
Ich hab es nach einem Tutorial gemacht (finde es leider nicht mehr)..
Aber hier mal der Code:
(HomeViewModel.cs)
class HomeViewModel : ViewModelBase
{
public ICommand NavigateNewCategoryCommand { get; private set; }
public HomeViewModel()
{
NavigateNewCategoryCommand = new DelegateCommand(OnNavigateNewCategoryCommandExecute);
}
void OnNavigateNewCategoryCommandExecute()
{
ServiceContainer.GetService<INavigationService>().Navigate("AddCategoryView", null, this);
}
Ich arbeite mit dem PageAdornerControl (habe ich vergessen zu sagen) von DEVEXPRESS
(MainWindow.xaml)
<dx:DXWindow x:Class="testproject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui"
xmlns:dxwuin="http://schemas.devexpress.com/winfx/2008/xaml/windowsui/navigation"
xmlns:ViewModel="clr-namespace:testproject.ViewModel"
xmlns:View="clr-namespace:testproject.View"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
ShowIcon="False" ShowTitle="False"
Title="testproject" Height="650" Width="1200" MinHeight="650" MinWidth="850" dx:ThemeManager.ThemeName="MetropolisDark">
<dx:DXWindow.DataContext>
<ViewModel:MainViewModel/>
</dx:DXWindow.DataContext>
<dxmvvm:Interaction.Triggers>
<dxmvvm:EventToCommand EventName="Loaded" Command="{Binding OnViewLoadedCommand}" />
</dxmvvm:Interaction.Triggers>
<dxmvvm:Interaction.Behaviors>
<!--Add the FrameNavigationService that provides navigation actions.-->
<dxwuin:FrameNavigationService Frame="{Binding ElementName=frame}"/>
</dxmvvm:Interaction.Behaviors>
<Grid>
<dxwui:NavigationFrame x:Name="frame" AnimationType="SlideHorizontal" BackNavigationMode="Root"/>
</Grid>
</dx:DXWindow>
(HomeView.xaml)
<UserControl x:Class="testproject.View.HomeView"
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"
mc:Ignorable="d"
xmlns:lc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxwuin="http://schemas.devexpress.com/winfx/2008/xaml/windowsui/navigation"
xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui"
xmlns:ViewModel="clr-namespace:testproject.ViewModel"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
d:DesignHeight="395" d:DesignWidth="600">
<!--DataContext for the current View-->
<UserControl.DataContext>
<ViewModel:HomeViewModel/>
</UserControl.DataContext>
<dxwui:PageAdornerControl Header="" Padding="-32,0,-32,-42" ShowBackButton="False" Name="aaa">
<lc:TileLayoutControl Padding="30,50,30,10" AllowItemMoving="False" BreakFlowToFit="True">
<lc:Tile Size="Small" Command="{Binding NavigateNewCategoryCommand}">
<TextBlock Text="Kazegorie" HorizontalAlignment="Center" VerticalAlignment="Center" />
</lc:Tile>
</lc:TileLayoutControl>
</dxwui:PageAdornerControl>
</UserControl>
Hoffe das hilft erstmal weiter...
Lieber Gruß,
Steffen
edit: hier das Tutorual -> http://documentation.devexpress.com/#wpf/CustomDocument15260
Aha - also DevExpress.
Siehe z.B. INavigationService.Navigate(String,Object,Object) Method (der 2. Parameter ist ein frei wählbares Objekt) oder How to: Pass data between loosely coupled View Models
Danke für die Antwort 😃
public partial class AddTextView : UserControl
{
public AddTextView (object _testobj)
{
InitializeComponent();
}
private void button_createPassword_Click(object sender, RoutedEventArgs e)
{
}
}
void OnNavigateNewTextCommandExecute()
{
object testobj= new object();
ServiceContainer.GetService<INavigationService>().Navigate("AddTextView", aaaa, this);
}
Wenn ich es so anstelle funktioniert es nicht. Es tut sich einfach nichts und danach klappen die anderen Controls auch nicht mehr... Was ist noch falsch?
Gruß,
Steffen
Hast du mal in die Doku geschaut?
Der Parameter muss in INavigationAware.OnNavigated abgefragt werden, statt im Konstruktor.