0

私はこれを理解するのに最悪の時間を過ごしています。まだ完全には理解していない MVVM を使用し、SQL からのデータで満たされたリストを radGridView にバインドする必要があります。簡単に聞こえます...しかし、私はそれを理解することはできません. データが表示されていません。バインドが間違っているためだと思います。以下は私の関連コードです。どんな助けでも大歓迎です!

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>
4

4 に答える 4

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
//.... 
}
于 2013-02-27T15:10:04.270 に答える
2
List<String> dataList = new List<String>();

これは単なるローカル変数であり、そのメソッド内でのみアクセス可能で有効です。プロパティまたはフィールドに移動する必要があります。

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

そしてメソッド内:

DataList= new List<String>();

while (reader.Read())
    for (int i = 0; i < reader.FieldCount; i++)
    {
        string rdr = reader[i].ToString();
        DataList.Add(rdr);
    }
于 2013-02-27T14:54:33.980 に答える
1

MVVM バインディングは、ViewModel のパブリック プロパティと連携します...

さらに、可能であれば、Observable Collections にバインドすることもお勧めします。

これには、次のコードを使用する必要があります。

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

OnPropertyChangedSub はイベントINotifiyPropertyChangedを発生させるため、コレクションへの変更は自動的に GridView に反映されます。

このサブを作成する必要がありますが、必要に応じて、このイベントを Setter で直接発生させることができます。

あなたのコードは次のようになります。

_Details = new ObserservableCollection<string>();

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

XAML は上記と同じままです。

于 2013-02-27T15:14:34.353 に答える
0

ビューとビューモデルを初期化するときに DataContext を設定してみてください

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

view.DataContext = viewModel;

別の解決策は、View に DataContex を設定することです。ただし、View に 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 でリストを表すパブリック プロパティを追加する必要があります。

于 2013-03-01T15:30:25.897 に答える