【问题标题】:WPF Unable to retrieve binding values MVVMWPF 无法检索绑定值 MVVM
【发布时间】:2017-02-09 01:16:20
【问题描述】:

当我在Textbox 中输入文本时,它会同时更新两个TextBlocks。我正在尝试检索该值以将其保存到 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" />

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

保存命令:

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。

编辑:我刚刚记得我将ViewModel 连接到两个UserControls。我的TabLayout,处理TabItems的内容;和工资单,其中包含保存按钮和一个TabControl,它将TabLayout 加载到每个TabItem 中。

两者的数据上下文是:

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

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

【问题讨论】:

  • 这里的所有代码都属于同一个类吗?您确定它都在该类的同一个实例上运行吗?你试过调试这个吗?
  • 如何/在哪里将 datacontext 设置为 ViewModel 实例?
  • @TaiT's 我在代码隐藏中设置它像这样DataContext = new PayslipModel();
  • @PieterWitvoet 是的,所有代码都在同一个类中,我相信它们在该类的同一个实例上运行
  • 发布的代码应该可以工作。至少它适用于我的机器。请注意,当绑定到十进制时,您将无法在框外输入小数点,请参阅Binding to decimal 要进一步调试您的绑定,请将此PresentationTraceSources.TraceLevel=High 添加到您的TextBox 如果您看到该值进入您的属性然后您的 Save 命令正在另一个实例上运行。在那种情况下,将您的代码发布在后面以及如何调用保存命令。

标签: c# wpf mvvm


【解决方案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);
}

用户控件

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

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

【讨论】:

  • 我实际上做了不同的事情,但我做了一些与你发布的类似的事情,所以它也应该可以工作。再次感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多