C# WPF无法检索绑定值MVVM
当我在C# WPF无法检索绑定值MVVM,c#,wpf,mvvm,C#,Wpf,Mvvm,当我在文本框中输入文本时,它会同时更新两个文本块。我试图检索该值以将其保存到sql数据库。我已经临时设置为在MessageBox中显示该值 视图模型/模型: private decimal _amount; public decimal Amount { get { return _amount; } set { _amount = value;
文本框
中输入文本时,它会同时更新两个文本块
。我试图检索该值以将其保存到sql数据库。我已经临时设置为在MessageBox中显示该值
视图模型/模型:
private decimal _amount;
public decimal Amount
{
get
{
return _amount;
}
set
{
_amount = value;
OnPropertyChanged("Amount");
}
}
<TextBox MaxLength="7" Visibility="{Binding Hide1, Converter={StaticResource BoolToVis},FallbackValue=Visible}" Text="{Binding Amount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" />
<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"/>
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");
}
}
文本框绑定:
private decimal _amount;
public decimal Amount
{
get
{
return _amount;
}
set
{
_amount = value;
OnPropertyChanged("Amount");
}
}
<TextBox MaxLength="7" Visibility="{Binding Hide1, Converter={StaticResource BoolToVis},FallbackValue=Visible}" Text="{Binding Amount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" />
<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"/>
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");
}
}
当我点击save时,消息框
显示0
编辑:我刚刚记得我将视图模型
连接到两个用户控件
。MyTabLayout
,它处理TabItems
的内容;工资单,包含保存按钮和一个TabControl
,它将TabLayout
加载到每个TabItem
两者的DataContext都是:
public TabLayout()
{
InitializeComponent();
DataContext = new PayslipModel();
}
public Payroll()
{
InitializeComponent();
DataContext = new PayslipModel();
}
如果您希望两个控件共享一个
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>
MainWindow.xaml.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();
}
}
public MainWindow(PayslipModel vm){
InitializeComponent();
tabControl = new TabControl(vm);
payRoll = new PayRoll(vm);
}
public TabLayout(PayslipModel vm)
{
InitializeComponent();
DataContext = vm;
}
public Payroll(PayslipModel vm)
{
InitializeComponent();
DataContext = vm;
}
用户控件
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();
}
}
public MainWindow(PayslipModel vm){
InitializeComponent();
tabControl = new TabControl(vm);
payRoll = new PayRoll(vm);
}
public TabLayout(PayslipModel vm)
{
InitializeComponent();
DataContext = vm;
}
public Payroll(PayslipModel vm)
{
InitializeComponent();
DataContext = vm;
}
这里的所有代码都是同一类的一部分吗?你确定它都在该类的同一个实例上运行吗?你试过调试这个吗?如何/在哪里设置ViewModel实例的datacontext?@TaiT's我在代码隐藏中设置它,就像这样
datacontext=new PayslipModel()
@PieterWitvoet是的,所有代码都在同一个类中,我相信它们在该类的同一个实例上运行。发布的代码应该可以工作。至少它能在我的机器上工作。请注意,当绑定到decimal时,您将无法在框外输入小数点,请参阅进一步调试您的绑定将此PresentationTraceSources.TraceLevel=High
添加到TextBox
如果您看到属性中的值,则您的Save命令正在另一个实例上运行。在这种情况下,将您的代码发布到后面,以及如何调用save命令。实际上,我的做法有所不同,但我做了一些与您发布的类似的事情,因此它也应该可以工作。再次感谢您的帮助:)