【问题标题】:WPF MVVM properties binding not working properlyWPF MVVM 属性绑定无法正常工作
【发布时间】:2016-11-25 04:47:39
【问题描述】:

我创建了一个视图模型,它具有一个学生模型的单个属性,然后我将其绑定到我的 XAML 中的控件。但是当我执行应用程序时什么都没有出现。

我在 app.xaml.cs 中设置数据上下文如下:

 protected override void OnStartup(StartupEventArgs e)   
 {         
   base.OnStartup(e);

   Registrationformusinemvvm.MainWindow window = new MainWindow();

   VMUser VM = new VMUser();

   window.DataContext = VM;

   window.Show();

 }

为什么绑定不起作用?

这是我的视图模型:

   public class VMUser:BaseClass
   {    
     private student _currentStudent;

     public student CurrentStudent
     {
         get { return _currentStudent; }
         set { 
               _currentStudent = value; 
               OnPropertyChanged("CurrentStudent");    
         }
     }
   }

我的学生模型班:

 public class student:BaseClass
 {      
   private string name="sumit";

     public string Name
     {
         get { return name; }
         set { name = value; OnPropertyChanged("Name"); }
     }

     private int rollNum;

     public int RollNum
     {
         get { return rollNum; }
         set { rollNum = value;OnPropertyChanged("RollNum"); }
     }

     private int phNum;

     public int PhNum
     {
         get { return phNum; }
         set { phNum = value;OnPropertyChanged("PhNum"); }
     }
     private string sub;

     public string Sub
     {
         get { return sub; }
         set { sub = value;OnPropertyChanged("Sub"); }
     }

 }

我的 XAML:

<Window x:Class="Registrationformusinemvvm.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Registrationformusinemvvm"
    xmlns:vm="clr-namespace:Registrationformusinemvvm.ViewModel"
    mc:Ignorable="d"

    Title="MainWindow" Height="350" Width="525">
  <!--<Window.DataContext>
    <vm:VMUser/>
  </Window.DataContext>-->
  <Window.Resources>

 </Window.Resources>
 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition Height="50"/>
        <RowDefinition Height="50"/>
        <RowDefinition Height="50"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Name"  Grid.Column="0" Grid.Row="0" FontSize="14"       

    FontWeight="Bold" VerticalAlignment="Center"   
    HorizontalAlignment="Center"/>
    <TextBlock Text="Roll Number" Grid.Column="0" Grid.Row="1" FontSize="14" 

   FontWeight="Bold" VerticalAlignment="Center"   

   HorizontalAlignment="Center"/>
    <TextBlock Text="Subject" Grid.Column="0" Grid.Row="2" FontSize="14" 

  FontWeight="Bold" VerticalAlignment="Center" 
  HorizontalAlignment="Center"/>
    <TextBlock Text="Phone Number" Grid.Column="0" Grid.Row="3"  
  FontSize="14" FontWeight="Bold" VerticalAlignment="Center" 
 HorizontalAlignment="Center"/>
    <TextBox Name="tbName" Text="{Binding CurrentStudent.Name,Mode=TwoWay,   
 UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="0" 
Width="120" Height="30" HorizontalAlignment="Center" 
VerticalAlignment="Center"/>
    <TextBox Name="tbRollnum" Text="{Binding CurrentStudent.RollNum}" 
Grid.Column="1" Grid.Row="1" Width="120" Height="30"   
HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBox Name="tbSub" Text="{Binding CurrentStudent.Sub}" 
Grid.Column="1" Grid.Row="2" Width="120" Height="30" 
HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBox Name="tbPh" Text="{Binding CurrentStudent.PhNum}" 
Grid.Column="1" Grid.Row="3" Width="120" Height="30" 
HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <Button Name="tbSubmit" Content="Submit" Grid.ColumnSpan="3" 
Grid.Row="4" Height="30" Width="100" HorizontalAlignment="Center"/>
</Grid>

</Window>

【问题讨论】:

  • 能否在运行时检查 Visual Studio 中的输出窗口,看看是否有任何绑定异常?可能是当前学生为空

标签: c# wpf xaml mvvm


【解决方案1】:

我的猜测是您的绑定不起作用,因为您的 _currentStudent 默认为 null。如果为 null,则初始化您的 _currentStudent。

    public student CurrentStudent
    {
        get { return _currentStudent = (_currentStudent ?? new student()); }
        set
        {
            _currentStudent = value; OnPropertyChanged("CurrentStudent");
        }
    }

【讨论】:

  • 它工作得很好谢谢 :) 我是否正确使用了 MVVM 模式?我有点困惑我将在哪里编写数据库操作查询。在模式或视图模型中?
  • 从上面的代码中我可以看到你做得很好,但要给出更好的答案,我必须看看你的项目的结构。看你有几个选择。例如,您可以在模型中有一个 db 上下文,然后您可以直接从您的 VM 查询,或者您可以添加另一个层并使用类似存储库模式的东西来处理您的查询,然后您可以从您的 VM 调用它。看这个问题:stackoverflow.com/questions/1717621/…。请记住将此标记为答案,以便它也可以帮助其他人。
  • 感谢 Bracher 的回复。请分享您的电子邮件,以便我可以发送我的演示代码。我需要一些指导,如果你能给我,我会很感激你的。
【解决方案2】:

您需要在模型类中添加 OnPropertyChanged。

void OnPropertyChanged(string prop)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }

        public event PropertyChangedEventHandler PropertyChanged;

【讨论】:

  • 在我的基类中我正在写这个。
  • 该实现中存在竞争条件。在调用之前将PropertyChanged 的值缓存到变量中,或者使用空条件运算符:PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop))
【解决方案3】:

根据您上面的代码,您不能将值分配给 CurrentStudent 属性,所以 你能检查一下你是否有 CurrentStudent 财产的价值。

感谢您的提问

【讨论】:

    【解决方案4】:

    App.Xaml

    中删除 StartupUri="YourXamlFile.xaml"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2012-06-21
      相关资源
      最近更新 更多