Laden...

WPF Datenverarbeitung

Erstellt von Steffen555 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.345 Views
S
Steffen555 Themenstarter:in
3 Beiträge seit 2013
vor 10 Jahren
WPF Datenverarbeitung

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

5.742 Beiträge seit 2007
vor 10 Jahren

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.

S
Steffen555 Themenstarter:in
3 Beiträge seit 2013
vor 10 Jahren

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

5.742 Beiträge seit 2007
vor 10 Jahren

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

S
Steffen555 Themenstarter:in
3 Beiträge seit 2013
vor 10 Jahren

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

5.742 Beiträge seit 2007
vor 10 Jahren

Hast du mal in die Doku geschaut?
Der Parameter muss in INavigationAware.OnNavigated abgefragt werden, statt im Konstruktor.