2013-02-27 1 views
0

나는 이것을 계산하는 데 최악의 시간을 보내고 있습니다. 나는 아직 완전히 이해하지 못하는 MVVM을 사용해야하고 SQL의 데이터로 채워진 목록을 radGridView에 바인드해야한다. 충분히 쉬운 것 같은데 ... 그러나 나는 그것을 이해할 수 없다. 데이터가 표시되지 않고 잘못된 것으로 바인딩되어 있기 때문입니다. 아래는 관련 코드입니다. 어떤 도움을 주시면 감사하겠습니다!GridView를 목록에 바인딩하기

C 번호 (HistoryAuditLogViewModel.cs) :

#region Private Fields 

     private DatabaseConnectionSetting dbSetting; 
     private string tableName = "Manufacturers"; 
     private int primaryKeyID = 1; 
     private string entryID; 
     private string manufacturerID; 
     private string manufacturerName; 
     private string auditDate; 
     private string sqlLogin; 
     private string application; 


     private string dbConnectionKey = Alliance.Infrastructure.Common.DatabaseConnectionSetting.BACKFLOW_SCOPE_KEY; 

     #endregion 

public void Load_Audit() 
     { 
      string strSQLconnection = (dbSetting.SqlConnectionString + "; User Id = " + dbSetting.SqlUserName + "; Password = " + dbSetting.SqlPassword + ";"); 
      SqlConnection sqlConnection = new SqlConnection(strSQLconnection); 

      sqlConnection.Open(); 
      SqlCommand sqlCommand = new SqlCommand("SELECT [EntryID], [AuditValue].value('(row/@ManufacturerID)[1]', 'int') as ManufacturerID, [AuditValue] .value('(row/@ManufacturerName)[1]', 'nvarchar(50)') as ManufacturerName, [AuditDate], [SqlLogin], [Application] from [Backflow].[dbo].[AuditLog] where (TableName = @tableName AND [EntryID] = @primarykey)", sqlConnection); 
      sqlCommand.Parameters.AddWithValue("@tablename", tableName); 
      sqlCommand.Parameters.AddWithValue("@primarykey", primaryKeyID); 

      SqlDataReader reader = sqlCommand.ExecuteReader(); 



      List<String> dataList = new List<String>(); 


      while (reader.Read()) 
       for (int i = 0; i < reader.FieldCount; i++) 
       { 
        string rdr = reader[i].ToString(); 

        dataList.Add(rdr); 
       } 
     } 

XAML (HistoryAuditLogView.xaml) :

<telerik:RadGridView Name="AuditGrid" ItemsSource="{Binding dataList}"> 

     </telerik:RadGridView> 
+0

'View'의'DataContext' 속성을 반드시'ViewModel'로 설정하십시오. offtopic :'sqlConnection'을 닫지 말아주세요. – Nogard

+0

'while'loop이 이상하게 보입니다. 테이블을 평평하게하여 목록에 올리시겠습니까? –

+0

아마 이상한 하하지만, 아니야. 기본적으로 나는이 일을 어떻게해야하는지 까다 롭지 않습니다. MVVM을 사용하고 SQL의 데이터를 DataGrid에 저장하면됩니다. @ 노가 널 연결을 종료하라고 상기시켜 주셔서 감사 드리며 DataContext 속성을 설정했습니다. – JLott

답변

2

전체 공공 재산, 당신을 도울 당신의 ViewModel의 루트 레벨에 추가 할 수 있습니다 :

#region Private Fields 
... 
#region 
#region Public Props 

private List<String> _dataList; 
public List<String> dataList 
{ 
get{ return _datalist;} 
set{_datalist = value;} 
} 

#region 


public void Load_Audit() 
     { 
dataList = new List<String>(); //then your code 
//.... 
} 

public List<String> DataList { get; set; } 

및 방법 내에서

+0

내 XAML이 현재 제대로 작동합니까? – JLott

+0

시도하기 전에 절대로 알지는 못하지만해야합니다. – Nogard

+0

알맞게 바인딩하고 있습니다. 이것은 아마도 목록을 사용하고 Hamlet이 말하는 것처럼 평평하게 만들기 때문입니다. 그러나 gridView의 각 열을 가로 지르는 데이터 대신 행 아래로 표시됩니다. 어떤 빠른 수정? 아니면 별도의 질문을 만들어야합니까? – JLott

2
List<String> dataList = new List<String>(); 

그것은 단지 그 방법 내에서 접근 가능하고 유효한 단지 지역 변수입니다. 당신은 속성 또는 필드로 이동해야 :

DataList= new List<String>(); 

while (reader.Read()) 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     string rdr = reader[i].ToString(); 
     DataList.Add(rdr); 
    } 
+0

그래서 get이나 set처럼? 내 VeiwModel 코드를 더 포함하도록 내 질문을 업데이트했습니다. – JLott

1

MVVM 바인딩은 ViewModel의 Public Properties와 함께 작동합니다 ...

또한 bet 가능한 경우 Observable Collections에 바인딩해야합니다.

이렇게하려면 다음 코드를 사용해야합니다. 컬렉션에 대한 변경 사항이 자동으로의 GridView에 반영되도록

private ObservableCollection<String> _DataList; 
public ObservableCollection<String> DataList { 
    get { return _DataList; } 
    set { 
     if (value.Equals(_Details) == false) { 
       _DataList= value; 
        OnPropertyChanged("DataList"); 
     } 
    } 
} 

OnPropertyChanged 서브는 INotifiyPropertyChanged 이벤트를 발생시킵니다.

원할 경우이 하위를 세터에서 직접 발생시킬 수 있습니다.

코드는 다음과 같습니다.

_Details = new ObserservableCollection<string>(); 

while (reader.Read()) 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     string rdr = reader[i].ToString(); 
     dataList.Add(rdr); 
    } 

XAML은 위에서와 동일하게 유지됩니다. 당신이보기를 초기화 할 때

0

봅니다 DataContext를 설정하는 뷰 모델

MyView view = new MyView(); 
MyViewModel viewModelodel = new MyViewModel(); 

view.DataContext = viewModel; 

타 솔루션이보기에 DataContex을 설정하는 것입니다. 그러나 ViewModels 위치를 말해야합니다. 물론

<Window x:Class="MyNamespace.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyNamespace" 
    Title="MainWindow" Height="Auto" Width="Auto" > 
<Window.DataContext> 
    <local:MyViewModel/> 
</Window.DataContext> 
</Window> 

당신은 당신의 ViewModel의 목록을 나타냅니다 공용 속성을 추가해야합니다.

관련 문제