c# - viewmodelbase - wpf tutorial deutsch



WPF Kann keine Bindungswerte MVVM abrufen (1)

Wenn ich Text in ein Textbox , aktualisiert es zwei TextBlocks gleichzeitig. Ich versuche, diesen Wert abzurufen, um ihn in einer SQL-Datenbank zu speichern. Ich habe es vorübergehend eingerichtet, um den Wert in einer MessageBox anzuzeigen.

ViewModel / Modell:

private decimal _amount;

    public decimal Amount
    {
        get
        {
            return _amount;
        }
        set
        {
            _amount = value;
            OnPropertyChanged("Amount");
        }
    }

TextBox-Bindung:

<TextBox MaxLength="7" Visibility="{Binding Hide1, Converter={StaticResource BoolToVis},FallbackValue=Visible}" Text="{Binding Amount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" />

TextBlocks Bindung:

<TextBlock Foreground="Black" Margin="0 0 0 0" VerticalAlignment="Top" Grid.Column="3" Text="{Binding Path=Amount}"/>
<TextBlock Grid.Column="3" Text="{Binding Amount}" Foreground="Black" Margin="0 0 0 0" VerticalAlignment="Bottom"/>

Speicherbefehl:

private async void Save()
    {
        try
        {
            MessageBox.Show(string.Format("{0}", Amount));
        }
        catch (DbEntityValidationException ex)
        {
            foreach (var en in ex.EntityValidationErrors)
            {
                var exceptionDialog = new MessageDialog
                {
                    Message = { Text = string.Format("{0}, {1}", en.Entry.Entity.GetType().Name, en.Entry.State) }
                };

                await DialogHost.Show(exceptionDialog, "RootDialog");

                foreach (var ve in en.ValidationErrors)
                {
                    exceptionDialog = new MessageDialog
                    {
                        Message = { Text = string.Format("{0}, {1}", ve.PropertyName, ve.ErrorMessage) }
                    };

                    await DialogHost.Show(exceptionDialog, "RootDialog");
                }
            }
        }
        catch(Exception ex)
        {
            var exceptionDialog = new MessageDialog
            {
                Message = { Text = string.Format("{0}", ex) }
            };

            await DialogHost.Show(exceptionDialog, "RootDialog");
        }

    }

Wenn ich auf Speichern MessageBox zeigt die MessageBox 0 an.

EDIT: Ich habe gerade daran erinnert, dass ich das ViewModel mit zwei UserControls . Mein TabLayout , das den Inhalt von TabItems ; und Payroll, die die Schaltfläche zum Speichern und ein TabControl das TabLayout in jedes TabItem .

DataContext für beide ist:

public TabLayout()
    {
        InitializeComponent();
        DataContext = new PayslipModel();
    }

public Payroll()
    {
        InitializeComponent();
        DataContext = new PayslipModel();
    }

Wenn Sie möchten, dass beide Steuerelemente einen DataContext teilen, können Sie eine Instanz aus Ihrem Composition-Root, dh App.Xaml.cs , App.Xaml.cs Das Folgende stimmt wahrscheinlich nicht mit dem App.Xaml.cs Ihrer Anwendung überein, sollte Ihnen aber die Idee geben. Auf der anderen Seite können Sie die Abhängigkeitsinjektion und die Zusammensetzung Ihres Objektdiagramms betrachten, aber das ist ein Anfang.

App.xaml

<Application x:Class="App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                 
             Startup="OnAppStartup">
    <Application.Resources>

    </Application.Resources>
</Application>

App.xmal.cs

public partial class App : Application {

    private void OnAppStartup(object sender, StartupEventArgs e) {                        
        Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose;
        var vm = new PayslipModel();
        var mainWindow = new MainWindow(vm);
        Application.Current.MainWindow = mainWindow;
        mainWindow.Show();
    }
}

HauptWindow.xaml.cs

public MainWindow(PayslipModel vm){
    InitializeComponent();
    tabControl = new TabControl(vm);
    payRoll = new PayRoll(vm);
}

Benutzersteuerelemente

public TabLayout(PayslipModel vm)
{
    InitializeComponent();
    DataContext = vm;
}

public Payroll(PayslipModel vm)
{
    InitializeComponent();
    DataContext = vm;
}




mvvm