PropertyChanged miért null?

PropertyChanged miért null?
2016-05-16T12:36:17+02:00
2016-05-16T22:28:55+02:00
2022-12-03T15:55:39+01:00
Syriuss
Sziasztok,

Valamiért a PropertyChanged event handlerem null és nem jövök rá miért. Hátha valaki kiszúrja mi a probléma. A kód .NET 4.0-ban készült. Ha a bal fölső gombra rákattanok, a középső gombnak enabled status-ba kellene váltania, de nem teszi:

XAML:

<Window x:Class="bindtry.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:bindtry.ViewModel" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <vm:ViewModelFVC x:Key="ViewModelFVC" /> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Button Click="Button_Click" Content="Katt" /> <Button Grid.Column="1" Grid.Row="1" Content="Hello" FontSize="22" FontWeight="Bold" IsEnabled="{Binding IsDeviceConnected, NotifyOnSourceUpdated=True, Source={StaticResource ViewModelFVC}}"/> </Grid> </Window>
cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace bindtry { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { ViewModel.ViewModelFVC vm; public MainWindow() { InitializeComponent(); vm = new ViewModel.ViewModelFVC(); DataContext = vm; } private void Button_Click(object sender, RoutedEventArgs e) { vm.IsDeviceConnected = true; } } }
ViewModelBase:
using System; using System.ComponentModel; using System.Collections.Generic; namespace bindtry.ViewModel { public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; internal void OnPropertyChanged(string prop) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(prop)); } } } }
ViewModel:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using bindtry.Model; namespace bindtry.ViewModel { class ViewModelFVC : ViewModelBase { public bool IsDeviceConnected { get { return am.isDeviceConnected; } set { am.isDeviceConnected = value; OnPropertyChanged("IsDeviceConnected"); } } private AppModel am; public ViewModelFVC() { am = new AppModel(); am.isDeviceConnected = false; } } }

Köszi!
Syrius
Mutasd a teljes hozzászólást!
Az adatkötésed túlbonyolítod, nem is egyértelmű, pontosan mit szerettél volna így elérni.

Legyen csak ennyi, mivel a DataContext-ed már definiáltad a code behind-ban:

IsEnabled="{Binding IsDeviceConnected}"
Tehát a teljes sor:

<Button Grid.Column="1" Grid.Row="1" Content="Hello" FontSize="22" FontWeight="Bold" IsEnabled="{Binding IsDeviceConnected}"/>
Ugyanakkor megjegyezném, hogy furcsa hibridet használsz, aminek így nem sok értelme van. Ha MVVM-mintát követsz, akkor ne kezelj eseményt a code behind-ban (gombnyomás), azt is adatkötéssel kéne megvalósítani (Command property a gombon és ICommand interface a ViewModel-ben), hogy ne legyen közvetlen referencia az UI-elemekre.

Itt találsz egy teljes WPF/MVVM példát, amely MvvmLight használatával működik. Itt megnézheted, hogyan lehet a fentieket használni.
Mutasd a teljes hozzászólást!

  • Szerintem eloszor probald meg, hogy public legyen a ViewModelFVC osztaly.
    Mutasd a teljes hozzászólást!
  • Ahhh, igaz. Viszont a probléma továbbra is fenn áll. :(
    Mutasd a teljes hozzászólást!
  • Az adatkötésed túlbonyolítod, nem is egyértelmű, pontosan mit szerettél volna így elérni.

    Legyen csak ennyi, mivel a DataContext-ed már definiáltad a code behind-ban:

    IsEnabled="{Binding IsDeviceConnected}"
    Tehát a teljes sor:

    <Button Grid.Column="1" Grid.Row="1" Content="Hello" FontSize="22" FontWeight="Bold" IsEnabled="{Binding IsDeviceConnected}"/>
    Ugyanakkor megjegyezném, hogy furcsa hibridet használsz, aminek így nem sok értelme van. Ha MVVM-mintát követsz, akkor ne kezelj eseményt a code behind-ban (gombnyomás), azt is adatkötéssel kéne megvalósítani (Command property a gombon és ICommand interface a ViewModel-ben), hogy ne legyen közvetlen referencia az UI-elemekre.

    Itt találsz egy teljes WPF/MVVM példát, amely MvvmLight használatával működik. Itt megnézheted, hogyan lehet a fentieket használni.
    Mutasd a teljes hozzászólást!
  • Ott a pont. Túl lett bonyolítva. Köszönöm!
    Az esemény kezelés csak a próba miatt került bele. Az a gomb nem lesz ott. A változót azt nem GUI esemény fogja állítani.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd