質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

2546閲覧

DataGridに動的に追加した行のデータをViewModelで取得(バインド)出来ない

wolf2

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/08/26 12:04

編集2019/08/26 12:07

現在作成中のシステムにて
DataGridに動的に行を追加し、追加した行をViewModelから取得しようとしているのですが
上手く取得できません。
どうすればうまく取得(バインド)出来るのでしょうか。

コードはこちらになります。
テストとして更新command部分でDataGridを取得しようとしています。

xaml

1 <DataGrid AlternatingRowBackground="LightBlue" AutoGenerateColumns="False" DataContext="{Binding Griding, Mode=TwoWay}" ItemsSource="{Binding}" x:Name="GridView" Margin="4,144,0,-232" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 2 <DataGrid.Columns> 3 <DataGridTextColumn IsReadOnly="True" Header="伝票番号" Binding="{Binding _Col1}"/> 4 <DataGridTextColumn IsReadOnly="True" Header="行" Binding="{Binding _Col2}"/> 5 <DataGridTextColumn IsReadOnly="True" Header="店名" Binding="{Binding _Col3}"/> 6 <DataGridTextColumn IsReadOnly="True" Header="色名" Binding="{Binding _Col4}"/> 7 <DataGridTextColumn IsReadOnly="True" Header="サイズ" Binding="{Binding _Col5}"/> 8 <DataGridTextColumn IsReadOnly="True" Header="納品日" Binding="{Binding _Col6}"/> 9 <DataGridTextColumn IsReadOnly="True" Header="発注日" Binding="{Binding _Col7}"/> 10 <DataGridTextColumn IsReadOnly="True" Header="発注数" Binding="{Binding _Col8}"/> 11 <DataGridTextColumn Header="訂正数" Binding="{Binding _Col9}"/> 12 <DataGridTextColumn IsReadOnly="True" Header="欠品数" Binding="{Binding _Col10}"/> 13 <DataGridTextColumn IsReadOnly="True" Header="原価単価" Binding="{Binding _Col11}"/> 14 <DataGridTextColumn IsReadOnly="True" Header="訂正原価" Binding="{Binding _Col12}"/> 15 <DataGridTextColumn IsReadOnly="True" Header="売単価" Binding="{Binding _Col13}"/> 16 <DataGridTextColumn IsReadOnly="True" Header="変更売単価" Binding="{Binding _Col14}"/> 17 </DataGrid.Columns> 18 </DataGrid>

C#

1if(DataSet.Rows.Count != 0) 2 { 3 DataTable m_dt = new DataTable("DataGrid"); 4 m_dt.Columns.Add(new DataColumn("_Col1", typeof(string))); 5 m_dt.Columns.Add(new DataColumn("_Col2", typeof(int))); 6 m_dt.Columns.Add(new DataColumn("_Col3", typeof(string))); 7 m_dt.Columns.Add(new DataColumn("_Col4", typeof(string))); 8 m_dt.Columns.Add(new DataColumn("_Col5", typeof(string))); 9 m_dt.Columns.Add(new DataColumn("_Col6", typeof(string))); 10 m_dt.Columns.Add(new DataColumn("_Col7", typeof(string))); 11 m_dt.Columns.Add(new DataColumn("_Col8", typeof(string))); 12 m_dt.Columns.Add(new DataColumn("_Col9", typeof(string))); 13 m_dt.Columns.Add(new DataColumn("_Col10", typeof(string))); 14 m_dt.Columns.Add(new DataColumn("_Col11", typeof(string))); 15 m_dt.Columns.Add(new DataColumn("_Col12", typeof(string))); 16 m_dt.Columns.Add(new DataColumn("_Col13", typeof(string))); 17 m_dt.Columns.Add(new DataColumn("_Col14", typeof(string))); 18 19 // サンプルデータ追加 20 DataRow newRowItem; 21 for (int i = 0; i < DataSet.Rows.Count; i++) 22 { 23 newRowItem = m_dt.NewRow(); 24 newRowItem["_Col1"] = DataSet.Rows[i].ItemArray[0].ToString(); 25 newRowItem["_Col2"] = (i + 1); 26 newRowItem["_Col3"] = DataSet.Rows[i].ItemArray[25].ToString(); 27 newRowItem["_Col4"] = "Nan"; 28 newRowItem["_Col5"] = "Nan"; 29 newRowItem["_Col6"] = DataSet.Rows[i].ItemArray[53].ToString(); 30 newRowItem["_Col7"] = DataSet.Rows[i].ItemArray[54].ToString(); 31 newRowItem["_Col8"] = DataSet.Rows[i].ItemArray[0].ToString(); 32 newRowItem["_Col9"] = DataSet.Rows[i].ItemArray[89].ToString(); 33 newRowItem["_Col10"] = "Nan"; 34 newRowItem["_Col11"] = DataSet.Rows[i].ItemArray[79].ToString(); 35 newRowItem["_Col12"] = DataSet.Rows[i].ItemArray[87].ToString(); 36 newRowItem["_Col13"] = DataSet.Rows[i].ItemArray[81].ToString(); 37 newRowItem["_Col14"] = "Nan"; 38 m_dt.Rows.Add(newRowItem); 39 } 40 41 GridView.DataContext = m_dt; 42 }

ViewModel

1using BmsClient.UI.Commands; 2using BmsClient.UI.Models; 3using BmsClient.UI.Printing; 4using BmsClient.UI.View; 5using System; 6using System.Collections.Generic; 7using System.Data; 8using System.Linq; 9using System.Text; 10using System.Threading.Tasks; 11using System.Windows; 12using System.Windows.Controls; 13using System.Windows.Input; 14 15namespace BmsClient.UI.ViewModels 16{ 17 class CorrectionEditWindowModel : LinkedViewModelBase<CorrectionEditWindowModel> 18 { 19 public string StoreCode { get; set; } 20 public string ItemCode { get; set; } 21 public string OrderDate { get; set; } 22 public DataGrid Griding { get; set; } 23 24 public CorrectionEditWindowModel() 25 { 26 } 27 28 /// <summary> 29 /// 更新コマンド。 30 /// </summary> 31 public ICommand UpdateCommand 32 { 33 get => new ActionCommand(() => 34 { 35 var test = Griding; 36 37 }); 38 } 39 40 41 /// <summary> 42 /// 画面削除コマンド。 43 /// </summary> 44 public ICommand ClearCommand 45 { 46 get => new ActionCommand(() => 47 { 48 }); 49 } 50 51 52 /// <summary> 53 /// 終了コマンド。 54 /// </summary> 55 public ICommand CloseCommand 56 { 57 get => new ActionCommand(() => 58 { 59 //View.Close(); 60 }); 61 } 62 63 public void ShowSelectedDate() 64 { 65 } 66 } 67} 68

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

二つ目のソースの

C#

1GridView.DataContext = m_dt;

ここでバインドの設定をつぶしてるんじゃないです?

そもそも、この二つ目のソース自体がどこで動いてるのか分からないんだけど、MVVMっぽくXAMLにはViewModelとのバインド設定を書いているのにコードビハインドっぽく処理を書くのはなぜですか?どうしてバインドしているデータを編集しないのでしょう?

そのあたりを頭に残してかずきさんのWPF4.5入門を見て勉強した方が良いかと思います
MVVMの基本を学べば自然とこの質問は解決するはずなので、とりあえず解決するソースコードを求めるのではなく基礎からきちんと学習すると今後はある程度の事は自力で解決できるようになっているはずです

まぁ、自分も初めてWPF触ったころはそもそもMVVMという言葉すら知らなかったのでWindowsFormsとの違いが画面の作り方って程度でしたけど

投稿2019/08/27 14:46

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DataGridのプロパティをバインドするというのを個人的にあまり見かけたことがなかったので、1つの実装案として聞いてもらえればと思います。
列名が定義されているようなので、クラスに列単位のプロパティを用意して、リストで実装してみてはいかがでしょうか。

XAML

1<DataGrid ItemsSource="{Binding DenpyoList}" (略) > 2 <DataGrid.Columns> 3 <DataGridTextColumn IsReadOnly="True" Header="伝票番号" Binding="{Binding Id}"/> 4 <DataGridTextColumn IsReadOnly="True" Header="行" Binding="{Binding Row}"/> 5 <DataGridTextColumn IsReadOnly="True" Header="店名" Binding="{Binding StoreName}"/> 6 7 (略) 8 9 </DataGrid.Columns> 10</DataGrid>

C#

1namespace BmsClient.UI.ViewModels 2{ 3 class CorrectionEditWindowModel : LinkedViewModelBase<CorrectionEditWindowModel> 4 { 5 // 動的にリストが変わる場合はList型よりもObservableCollection型を利用した方が良いです。 6 public ObservableCollection<Denpyo> DenpyoList { get; set; } 7 8 () 9 } 10}

C#

1namespace BmsClient.UI.Models 2{ 3 // 伝票情報クラス 4 public class Denpyo 5 { 6 public string Id { get; set; } 7 public string Row { get; set; } 8 public string StoreName { get; set; } 9 10 () 11 } 12}

投稿2019/08/26 12:33

takapi_cs

総合スコア349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wolf2

2019/08/26 13:02

ご回答有難う御座います! ご教示頂いたコードを参考にリストで試してみたのですが、ビューモデルから値が取れませんでした。。。 var data = new Denpyo { _Col1 = "TEST", _Col2 = "TEST", _Col3 = "TEST", _Col4 = "TEST", _Col5 = "TEST", _Col6 = "TEST", _Col7 = "TEST", _Col8 = "TEST", _Col9 = "TEST", _Col10 = "TEST", _Col11 = "TEST", _Col12 = "TEST", _Col13 = "TEST", _Col14 = "TEST" }; GridView.Items.Add(data); みたいな形で追加するだけでは値は取れないのでしょうか。
takapi_cs

2019/08/26 14:33

私の環境でリストの場合の動作を確認してみたところ、動くことが確認できました。 MVVMフレームワークは何か使用していますか? 私の場合、普段からPrismに頼りきりで、DataContextを触ったりコードビハインドに書いたりはほとんどなかったので、そのあたりは詳しくわからないです。。。 また、エラーなど出ていますか?
wolf2

2019/08/26 14:49

なるほど、、、フレームワークはXamarin?でしょうか、、 他の方からの引継ぎかつ初めてWPFでの作成を行っているので不確か申し訳御座いません、、 エラーは特に出ないのでやり方が間違っているのかもしれません。 私のやろうとしていることは ビューモデルでObservableCollectionをDenpyoクラスで初期化しようとしています。
takapi_cs

2019/08/27 13:47 編集

XamarinはMVVMフレームワークではないですね。 Xamarin(ザマリン) とはなんぞや https://qiita.com/amay077/items/38ee79b3e3e88cf751b9 ----- WPFでMVVMフレームワークといえば、PrismやMVVM light、Livetなどでしょうか。 聞いた感じではMVVMフレームワークを使っていないようですので、ViewとViewModelのクラスが関連付けできているか気になります。 ViewクラスのxamlまたはコードビハインドでViewModelクラスのインスタンスを生成していますか? WPF で DataContext を 設定 する 方法 https://garafu.blogspot.com/2014/09/wpf-datacontext.html ----- LinkedViewModelBase<CorrectionEditWindowModel>はどのようなクラスでしょうか? ViewModelクラスはINotifyPropertyChangedクラスが継承されていないと、プロパティの変更がViewクラスに通知されません。 INotifyPropertyChangedを使った簡単なWPFサンプル例 [C#][WPF] http://nprogram.hatenablog.com/entry/2018/01/04/151911
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問