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

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

ただいまの
回答率

90.53%

  • C#

    8820questions

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

  • WPF

    815questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 99

mercurian-teto

score 59

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

<ListView x:Name="listview_item" HorizontalAlignment="Center" ItemsSource="{Binding Mode=OneWay}" 

                             Height="222" Margin="0,-2,0,3" Grid.Column="3"  VerticalAlignment="Top" Width="456" >
                                <ListView.ContextMenu>
                                    <ContextMenu Name="ZoneIformationList" StaysOpen="true" Background="WhiteSmoke">
                                        <ContextMenu.BitmapEffect>
                                            <BitmapEffectGroup/>
                                        </ContextMenu.BitmapEffect>

                                        <MenuItem Header="Edit" Name="EditNutritionContextMenu"  Click="EditNutritionContextMenu_OnClick"/>
                                        <MenuItem Header="Remove" Name="RemoveNutritionContextMenu" Click="RemoveNutritionContextMenu_OnClick"/>
                                    </ContextMenu>
                                </ListView.ContextMenu>

                                <!--<ListView.ItemContainerStyle>
                                    <Style TargetType="{x:Type ListViewItem}">
                                        <Setter Property="BorderBrush" Value="LightGray" />
                                        <Setter Property="BorderThickness" Value="0,0,0,1" />
                                        <Setter
                                        Property="Tag"
                                        Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType=ListView}}" /> 

                                                    <Setter Property="ContextMenu">
                                                        <Setter.Value>
                                                            <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                                                            <MenuItem
                                        Header="Select"
                                        Command="{Binding SelectCommand}"
                                        CommandParameter="{Binding PlacementTarget.Content, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />   
                                                </ContextMenu>
                                        </Setter.Value>
                                        </Setter>
                                    </Style>
                                </ListView.ItemContainerStyle>-->
                                <ListView.View>

                                    <GridView>
                                        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" />
                                        <GridViewColumn DisplayMemberBinding="{Binding Timer}" Header="Timer"/>
                                        <GridViewColumn DisplayMemberBinding="{Binding Opsion}" Header="Opsion"/>


                                    </GridView>
                                </ListView.View>
                        </ListView>
   using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace aaaaa
{
    /// <summary>
    /// listview.xaml の相互作用ロジック
    /// </summary>
    public partial class listview : UserControl
    {
        public System.Collections.ObjectModel.ObservableCollection<Listview_Column> Listview_Column { get; set; }
        public static List<Listview_Column> listview_array = new List<Listview_Column>();

        public listview()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            listview_array.Add(new Listview_Column()
            {
                Name="a",
                Age="1",
                Opsion="0"
            });
            listview_item.ItemsSource = listview_array;
        }




        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            listview_array.Add(new Listview_Column()
            {
                Name = "a",
                Age = "1",
                Opsion = "0"
            });
            listview_item.ItemsSource = listview_array;
        }

        public static void ListUpDate()
        {
            listview_array.Add(new Listview_Column()
            {
                Name = "a",
                Age = "1",
                Opsion = "0"
            });
            //listview_item.ItemsSource = listview_array;
      //エラー:
           //静的でないフィールド、メソッドまたはプロパティでオブジェクト参照が必要です。
        }
    }





    public class Listview_Column
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Opsion { get; set; }

    }
}


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を先ほど征ったように更新できるようにしたいです。回答お願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • draq

    2019/04/15 07:37

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

    キャンセル

回答 1

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    8820questions

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

  • WPF

    815questions

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

  • トップ
  • C#に関する質問
  • Wpf listviewオブジェクト参照が必要というエラー buttonイベントならエラーは起きないが、自作の関数の中ではエラー