2017-02-08 8 views
0

Когда я ввожу текст в Textbox, он одновременно обновляет два TextBlocks. Я пытаюсь восстановить это значение, чтобы сохранить его в базе данных sql. Я временно установил его для отображения значения в MessageBox.WPF Невозможно получить значения привязки MVVM

ViewModel/Модель:

private decimal _amount; 

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

TextBox Переплет:

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

TextBlocks Переплет:

<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"/> 

SaveCommand:

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"); 
     } 

    } 

Когда я ударил сохранить, то MessageBox показывает 0.

EDIT: Я только что вспомнил, что у меня есть ViewModel подключен к двум UserControls. Мой TabLayout, который обрабатывает содержимое TabItems; и Payroll, который содержит кнопку сохранения и TabControl, которая загружает TabLayout в каждый TabItem.

DataContext для обоих:

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

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

Все ли здесь код одного и того же класса? Вы уверены, что все работает на одном экземпляре этого класса? Вы пробовали отлаживать это? –

+0

Как и где вы устанавливаете datacontext для экземпляра ViewModel? –

+0

@ TaiT я установил его в коде, как это: DataContext = new PayslipModel(); ' – bruh1234

ответ

1

Если вы хотите, оба элемента управления, чтобы поделиться DataContext, то вы можете впрыснуть экземпляр из корневой состав, т.е. App.Xaml.cs Следующая, вероятно, не соответствует пути ваше приложение но должен дать вам эту идею. Вниз вы можете посмотреть инъекцию зависимостей и как составить граф объекта, но это начало.

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(); 
    } 
} 

MainWindow.xaml.cs

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

UserControls

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

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

Я действительно делал это по-другому, но я сделал что-то похожее на то, что вы разместили, чтобы он тоже работал. Спасибо за помощь снова :) – bruh1234