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

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

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

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

WPF

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

Q&A

解決済

1回答

1065閲覧

Wpf listviewオブジェクト参照が必要というエラー buttonイベントならエラーは起きないが、自作の関数の中ではエラー

mercurian-teto

総合スコア75

C#

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

WPF

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

0グッド

0クリップ

投稿2019/04/14 18:35

編集2019/04/14 18:36

下のようなユーザーコントロール(csとxaml)を用意しました。
一部省略してあります。
このwpfのコードをベースにして作成しています。

listview.xaml

1 2<ListView x:Name="listview_item" HorizontalAlignment="Center" ItemsSource="{Binding Mode=OneWay}" 3 4 Height="222" Margin="0,-2,0,3" Grid.Column="3" VerticalAlignment="Top" Width="456" > 5 <ListView.ContextMenu> 6 <ContextMenu Name="ZoneIformationList" StaysOpen="true" Background="WhiteSmoke"> 7 <ContextMenu.BitmapEffect> 8 <BitmapEffectGroup/> 9 </ContextMenu.BitmapEffect> 10 11 <MenuItem Header="Edit" Name="EditNutritionContextMenu" Click="EditNutritionContextMenu_OnClick"/> 12 <MenuItem Header="Remove" Name="RemoveNutritionContextMenu" Click="RemoveNutritionContextMenu_OnClick"/> 13 </ContextMenu> 14 </ListView.ContextMenu> 15 16 <!--<ListView.ItemContainerStyle> 17 <Style TargetType="{x:Type ListViewItem}"> 18 <Setter Property="BorderBrush" Value="LightGray" /> 19 <Setter Property="BorderThickness" Value="0,0,0,1" /> 20 <Setter 21 Property="Tag" 22 Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListView}}" /> 23 24 <Setter Property="ContextMenu"> 25 <Setter.Value> 26 <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 27 <MenuItem 28 Header="Select" 29 Command="{Binding SelectCommand}" 30 CommandParameter="{Binding PlacementTarget.Content, RelativeSource={RelativeSource AncestorType=ContextMenu}}" /> 31 </ContextMenu> 32 </Setter.Value> 33 </Setter> 34 </Style> 35 </ListView.ItemContainerStyle>--> 36 <ListView.View> 37 38 <GridView> 39 <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" /> 40 <GridViewColumn DisplayMemberBinding="{Binding Timer}" Header="Timer"/> 41 <GridViewColumn DisplayMemberBinding="{Binding Opsion}" Header="Opsion"/> 42 43 44 </GridView> 45 </ListView.View> 46 </ListView> 47

listview.xaml.cs

1 2 using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7using System.Windows; 8using System.Windows.Controls; 9using System.Windows.Data; 10using System.Windows.Documents; 11using System.Windows.Input; 12using System.Windows.Media; 13using System.Windows.Media.Imaging; 14using System.Windows.Navigation; 15using System.Windows.Shapes; 16 17namespace aaaaa 18{ 19 /// <summary> 20 /// listview.xaml の相互作用ロジック 21 /// </summary> 22 public partial class listview : UserControl 23 { 24 public System.Collections.ObjectModel.ObservableCollection<Listview_Column> Listview_Column { get; set; } 25 public static List<Listview_Column> listview_array = new List<Listview_Column>(); 26 27 public listview() 28 { 29 InitializeComponent(); 30 } 31 32 private void Button_Click(object sender, RoutedEventArgs e) 33 { 34 listview_array.Add(new Listview_Column() 35 { 36 Name="a", 37 Age="1", 38 Opsion="0" 39 }); 40 listview_item.ItemsSource = listview_array; 41 } 42 43 44 45 46 private void Button_Click_1(object sender, RoutedEventArgs e) 47 { 48 listview_array.Add(new Listview_Column() 49 { 50 Name = "a", 51 Age = "1", 52 Opsion = "0" 53 }); 54 listview_item.ItemsSource = listview_array; 55 } 56 57 public static void ListUpDate() 58 { 59 listview_array.Add(new Listview_Column() 60 { 61 Name = "a", 62 Age = "1", 63 Opsion = "0" 64 }); 65 //listview_item.ItemsSource = listview_array; 66      //エラー: 67 //静的でないフィールド、メソッドまたはプロパティでオブジェクト参照が必要です。 68 } 69 } 70 71 72 73 74 75 public class Listview_Column 76 { 77 public string Name { get; set; } 78 public string Age { get; set; } 79 public string Opsion { get; set; } 80 81 } 82}

List型の変数を利用してlistviewを初期化しています。(かならずList型を使うこととします)

buttonのclickのイベントの関数の中ではlistview_itemにアクセスできて、

ListUpDate()ではlistview_itemにアクセスできず、オブジェクト参照が必要とエラーが出てしまいます。

ListUpDate()はほかのWindowのクラスでlistview.ListUpDate()と宣言して利用するつもりです。
windowからモーダレスのdialogを出現させて、そのdialogから親元のwindowのlistviewを更新して再表示させようとしています。

ListUpDate()内におけるlistview_itemにアクセスできないエラーでオブジェクト参照が必要とあったのですが、listUpDate内で

listview lv= new listview(); lv.listview_item.ItemsSource = listview_array;

としたのですが、listviewが更新されていませんでした。

listUpDate()からlistview_itemにアクセスできるようになり、listviewを先ほど征ったように更新できるようにしたいです。回答お願いします。

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

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

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

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

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

draq

2019/04/14 22:37

色々省略しすぎでよくわかりませんが、ListUpDateメソッドが静的メソッドとして宣言されているからでは? 全体的にstaticをつけている箇所は意味を理解してるんでしょうか?
guest

回答1

0

ベストアンサー

ボタンのクリックイベントはインスタンスメソッドです。
ListUpDate は静的メソッドです。
この違いですね。

listview_item はコントロールのプロパティなのでそれを操作するにはインスタンスを指定する必要がありますが、静的メソッドなのでインスタンスがありません。
https://code.msdn.microsoft.com/windowsdesktop/WPFWindow-fc38afef を参考に表示中のウィンドウをまず取得し、そこから ListView のインスタンスを取得し、それを使用してください。

投稿2019/04/14 23:54

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問