2017-05-29 20 views
0

私はこのタイプの質問が何度も尋ねられていることを知っています。しかし、私はInotifyPropertyなどを使用せずにこれを達成しようとしています。モデルからデータを表示するための単純なコードが必要です。 このため、次の方法論を使用してDatagridをバインドしようとしています。MVVmでWPFを使用してDataGridをバインド

public class PrimaryModel 
{ 
    private int _id; 

    public int ID 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    private string _userName; 

    public string UserName 
    { 
     get { return _userName; } 
     set { _userName = value; } 
    } 

    private string _password; 

    public string Password 
    { 
     get { return _password; } 
     set { _password = value; } 
    } 

    private DateTime _createdDateTime; 

    public DateTime CreatedDateTime 
    { 
     get { return _createdDateTime; } 
     set { _createdDateTime = value; } 
    } 

    private DateTime _lastLoginDateTime; 

    public DateTime LastLoginDateTime 
    { 
     get { return _lastLoginDateTime; } 
     set { _lastLoginDateTime = value; } 
    } 

    private bool _isActive; 

    public bool IsActive 
    { 
     get { return _isActive; } 
     set { _isActive = value; } 
    } 
} 

AのViewModel:

public class PrimaryViewModel 
{ 
    private ObservableCollection<PrimaryModel> _UsersList; 

    public PrimaryViewModel() 
    { 
     _UsersList = new ObservableCollection<PrimaryModel> 
     { 
      new PrimaryModel { ID=1,UserName="Raghava",Password="Something",CreatedDateTime=DateTime.Now,LastLoginDateTime=DateTime.Now,IsActive=true } 
     }; 
    } 

    public ObservableCollection<PrimaryModel> Users 
    { 
     get { return _UsersList; } 
     set { _UsersList = value; } 
    } 
} 

そして、XAMLファイル:私はViewModelにを通じて基本的なIDおよびユーザ名を表示するには、データグリッドをバインドするにはどうすればよい

<Window x:Class="Sample4.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:Sample4" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid Name="usersData" ItemsSource="{Binding Source=_UsersList}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Path=ID}" /> 
       <DataGridTextColumn Binding="{Binding Path=UserName}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

は私がモデルを持っています?

答えて

0
public class PrimaryViewModel 
    { 
     public ObservableCollection<PrimaryModel> Users //Allways private set - to not destroy the Binding! Use Clear instead of reintializing !!! 
     { 
      get; 
      private set; 
     } 

     public PrimaryViewModel() 
     { 
      Users = new ObservableCollection<PrimaryModel> 
      { 
       new PrimaryModel { ID=1,UserName="Raghava",Password="Something",CreatedDateTime=DateTime.Now,LastLoginDateTime=DateTime.Now,IsActive=true } 
      }; 
     } 
    } 

uは主に間違ったItemSource ...

 <DataGrid Name="usersData" ItemsSource="{Binding Path=Users}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Path=ID}"/> 
       <DataGridTextColumn Binding="{Binding Path=UserName}" /> 
      </DataGrid.Columns> 
     </DataGrid> 

を設定し、uはINotifiyPropertyChangedで自分のものに更新したくないので - 彼らはあなたのデータグリッド内のフィールドので、民間へのすべてのSetterを設定してください現在は更新されていません。

また、プロパティですべてのフィールドをラップする理由は何ですか?

+0

私はMVVMパターンでWPFを学習してみませんか午前主題についての知識があまりない。ですから、基本的には、データグリッドにデータを取り込もうとしています。私は自分の提案に従ってコードを更新しようとしましたが、まだ出力を見ることができません。 – raghava

+1

私の答えに書いたように:あなたのビューのDataContextも設定する必要があります。あなたはそれをしましたか? –

+0

MightyBadaboomが言ったのは... MainWindow.xaml.csに行き、次にコンストラクタ 'public MainWindow()に移動します。 { InitializeComponent(); this.DataContext = new PrimaryViewModel(); } ' – Peter

0

ItemsSource="{Binding Source=Users}"のようなXAMlコードでバインドを変更してください。プライベートフィールドにバインドすることはできません。あなたは公共の財産を使わなければなりません。

ビューのDataContextも設定する必要があります。あなたはそれをしましたか?

しかし、INotifyProperyChangedのないMVVMとバインディングは悪い選択です。 ViewModelが変更されても、ビューは更新されません。

0

ビューのDataContextをビューモデルのインスタンスに設定する必要があります。

あなたがいずれかのビューのコードビハインドでこれを行うことができ

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new PrimaryViewModel(); 
    } 
} 

...またはXAMLマークアップで:

<Window x:Class="Sample4.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:Sample4" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.DataContext> 
     <local:PrimaryViewModel /> 
    </Window.DataContext> 
    <Grid> 
     <DataGrid Name="usersData" ItemsSource="{Binding Source=_UsersList}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Path=ID}" /> 
       <DataGridTextColumn Binding="{Binding Path=UserName}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 
関連する問題