Как я могу обновить свой XAML, когда я меняю currentUser через viewmodel? - PullRequest
0 голосов
/ 15 апреля 2020

Я создаю свое первое «большее» приложение WPF, и я подумал о чем-то похожем на трут. Я уже создал карту, которая выглядит следующим образом: Результат

Показывает первого пользователя в моей базе данных. Моя цель - когда я нажимаю правую (следующую) или левую (предыдущую) кнопки, чтобы показать следующего или предыдущего пользователя из моей базы данных.

Вот моя модель класса Gebruiker (извините за голландские имена .. ):

namespace project_amber_akkermans.Model
{
    class Gebruiker : BaseModel
    {
        private int id;
        private string naam;
        private string adres;
        private string woonplaats;
        private string email;
        private string gsm;
        private string functie;
        private string bestemming;

        public int ID { get; set; }
        public string Naam { get; set; }
        public string Adres { get; set; }
        public string Woonplaats { get; set; }
        public string Email { get; set; }
        public string Gsm { get; set; }
        public string Bestemming { get; set; }
        public string Functie { get; set; }

    }
}

Моя модель представления, я вижу, что мои команды next и prev обновляют идентификатор, и выполняется sql, но я не знаю, не обновляется ли мой currentGebruiker, или что мой XAML не обновляется:

class ZoekMatchViewModel : BaseViewModel
    {
        public ZoekMatchViewModel()
        {
            LeesGebruiker(1);
            KoppelenCommands();
        }
        private int aantal_gebruikers;
        public int Aantal_gebruikers
        {
            get
            {
                return aantal_gebruikers;
            }

            set
            {
                aantal_gebruikers = value;
                NotifyPropertyChanged();
            }
        }
        private Gebruiker currentGebruiker;
        public Gebruiker CurrentGebruiker
        {
            get
            {
                return currentGebruiker;
            }

            set
            {
                currentGebruiker = value;
                NotifyPropertyChanged();
            }
        }

        private void KoppelenCommands()
        {
            NextCommand = new BaseCommand(VolgendeGebruiker);
            PrevCommand = new BaseCommand(VorigeGebruiker);
        }

        public ICommand NextCommand { get; set; }
        public ICommand PrevCommand { get; set; }

        private void LeesGebruikers()
        {
            //instantiëren dataservice
            ZoekMatchDataService zoekMatchDS =
                new ZoekMatchDataService();

            aantal_gebruikers = zoekMatchDS.GetGebruikers();
        }

        private void LeesGebruiker(int id)
        {
            //instantiëren dataservice
            ZoekMatchDataService zoekMatchDS =
                new ZoekMatchDataService();

            currentGebruiker = zoekMatchDS.GetGebruiker(id);
        }


        public void VolgendeGebruiker()
        {
            if (CurrentGebruiker != null)
            {
                if (currentGebruiker.ID+1 != aantal_gebruikers) //if id +1 != number of users in the database, if last user in database, jump back to first
                {
                    int id = (currentGebruiker.ID) + 1;
                    LeesGebruiker(id);
                }
                else
                {
                    int id = 1;
                    LeesGebruiker(id);
                }
            }
        }


        public void VorigeGebruiker()
        {
            if (CurrentGebruiker != null)
            {
                if (currentGebruiker.ID-1 != 0) //if id -1 != 0 (lowest id = 1, so if 0, jump to last user)
                {
                    int id = (currentGebruiker.ID) - 1;
                    LeesGebruiker(id);
                }
                else
                {
                    int id = aantal_gebruikers;
                    LeesGebruiker(id);
                }                
            }
        }
    }

Класс Dataservice, который получает данные из моей базы данных (я использую Dapper):

class ZoekMatchDataService
    {
        // Ophalen ConnectionString uit App.config
        private static string connectionString =
            ConfigurationManager.ConnectionStrings["local"].ConnectionString;
        // Stap 1 Dapper
        // Aanmaken van een object uit de IDbConnection class en 
        // instantiëren van een SqlConnection.
        // Dit betekent dat de connectie met de database automatisch geopend wordt.

        private static IDbConnection db = new SqlConnection(connectionString);

        public int GetGebruikers()
        {
            // Stap 2 Dapper
            // Uitschrijven SQL statement & bewaren in een string. 
            string sql = "Select * from Gebruiker";

            // Stap 3 Dapper
            // Uitvoeren SQL statement op db instance 
            // Type casten van het generieke return type naar een collectie van contactpersonen
            return (int)db.Query<Gebruiker>(sql).Count();

        }

        public Gebruiker GetGebruiker(int id)
        {
            // Stap 2 Dapper
            // Uitschrijven SQL statement & bewaren in een string. 
            string sql = "Select * from Gebruiker where ID = " + id;

            // Stap 3 Dapper
            // Uitvoeren SQL statement op db instance 
            return (Gebruiker)db.Query<Gebruiker>(sql).FirstOrDefault();

        }
        public void InsertMatch(Gebruiker gebruiker)
        {
            // SQL statement insert
            string date = DateTime.UtcNow.ToString("dd-MM-YYYY");
            string sql = "Insert into Match (Gebruiker1Id, Gebruiker2Id, Datum, Geaccepteerd) values (1," + gebruiker.ID + ","+ date +", false)";

            // Uitvoeren SQL statement en doorgeven parametercollectie
            db.Execute(sql, new
            {
                gebruiker.Naam,
                gebruiker.Email
            });
        }
    }

И самая важная часть из моего XAML:

<Page x:Class="project_amber_akkermans.View.MakeMatch"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:project_amber_akkermans.View"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        xmlns:smtx="clr-namespace:ShowMeTheXAML;assembly=ShowMeTheXAML" 
        xmlns:viewmodel="clr-namespace:project_amber_akkermans.ViewModel"
        mc:Ignorable="d"
        Title="MakeMatch" Height="450" Width="800">
    <Page.Resources>
        <viewmodel:ZoekMatchViewModel x:Key="ZoekMatchViewModel"/>
    </Page.Resources>
    <DockPanel LastChildFill="True" HorizontalAlignment="Center" VerticalAlignment="Center" DataContext="{DynamicResource ZoekMatchViewModel}">
        <Button Command="{Binding PrevCommand}" Background="Transparent" BorderThickness="0" Height="50">
            <StackPanel Orientation="Horizontal" DockPanel.Dock="Left" VerticalAlignment="Center" Margin="0 -10 35 0">
                <materialDesign:PackIcon Kind="ChevronLeft" Foreground="DarkGoldenrod" Background="Transparent" Margin="0 0 -50 0" Width="65" Height="65" />
                <materialDesign:PackIcon Kind="ChevronLeft" Foreground="LightSlateGray" Margin="0 0 -50 0" Width="65" Height="65"/>
                <materialDesign:PackIcon Kind="ChevronLeft" Foreground="WhiteSmoke" Margin="0 0 -50 0" Width="65" Height="65"/>
            </StackPanel>
        </Button>
        <smtx:XamlDisplay Key="cards_1"  Margin="4 4 0 0">
            <materialDesign:Flipper Style="{StaticResource MaterialDesignCardFlipper}">
                <materialDesign:Flipper.FrontContent>
                    <Grid Height="350" Width="200">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="250" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <materialDesign:ColorZone Mode="PrimaryMid" VerticalAlignment="Stretch">
                            <materialDesign:PackIcon Kind="AccountCircle" Height="128" Width="128"
                                                             VerticalAlignment="Center" HorizontalAlignment="Center" />
                        </materialDesign:ColorZone>
                        <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
                            <TextBlock Text="{Binding CurrentGebruiker.Naam , Mode=TwoWay}"></TextBlock>
                            <Button Style="{StaticResource MaterialDesignFlatButton}" Foreground="DarkGoldenrod"
                                            Command="{x:Static materialDesign:Flipper.FlipCommand}"
                                            Margin="0 4 0 0"
                                            >SHOW DETAILS</Button>
                        </StackPanel>
                    </Grid>
                </materialDesign:Flipper.FrontContent>

Я надеюсь, что я достаточно ясно понимаю мою проблему, и надеюсь, что любой может помочь мне решить ее

1 Ответ

1 голос
/ 15 апреля 2020

У вас есть полное свойство

private Gebruiker currentGebruiker;
public Gebruiker CurrentGebruiker
{
    get
    {
        return currentGebruiker;
    }

    set
    {
        currentGebruiker = value;
        NotifyPropertyChanged();
    }
}

и для изменения его значения используйте backfield:

private void LeesGebruiker(int id)
{
    ...
    currentGebruiker = zoekMatchDS.GetGebruiker(id);
}

Если вы это сделаете, то установщик свойства не вызывается, уведомление не поднимается, привязка не обновляется.

Использовать свойство:

CurrentGebruiker = zoekMatchDS.GetGebruiker(id);
...