C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: DataContextの更新を反映したい


(過去ログ 60 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■34611 / inTopicNo.1)  DataContextの更新を反映したい
  
□投稿者/ 倉田 有大 (516回)-(2009/04/02(Thu) 22:02:34)

分類:[.NET 全般] 

2009/04/02(Thu) 22:03:39 編集(投稿者)
こんばんわ、倉田 有大です。
前回、XAMLのImageでお世話になりました。

DataContextの更新を画面に反映したいのですがどうすればよいのでしょうか?
検索すればINotifyPropertyChangedを継承しろと書いてあるのですが、うまく動いてくれません。
下記のようなコードを書いてみましたが、PropertyChangedってからのままですよね?^^;サンプル見ても+= new しているところがみつからない-


using System.ComponentModel;

namespace WPFTest3
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public class List2 : List<Data>, INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;

            public void Changed()
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }

        List2 list;

        public class Data
        {
            public string Name { get; set; }
        }
        public Window1()
        {
            InitializeComponent();
            list = new List2();
            list.Add(new Data { Name = "name1" });
            this.listView1.DataContext = list;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            list = new List2();
            list.Add(new Data { Name = "name2" });
        }
    }
}

<Window x:Class="WPFTest3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ListView Margin="68,66,90,96" ItemsSource="{Binding}" Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="name" DisplayMemberBinding="{Binding Name}"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Height="23" Margin="98,20,106,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button>
    </Grid>
</Window>

引用返信 編集キー/
■34613 / inTopicNo.2)  Re[1]: DataContextの更新を反映したい
□投稿者/ 囚人 (334回)-(2009/04/02(Thu) 22:10:11)
List2 には Name ってプロパティがないでしょ。要するに実装するクラスが間違ってます。
引用返信 編集キー/
■34614 / inTopicNo.3)  Re[1]: DataContextの更新を反映したい
□投稿者/ nori (67回)-(2009/04/02(Thu) 22:27:00)
INotifyPropertyChangedを実装する場所が違います。
Dataクラスに対して実装してください。

>サンプル見ても+= new しているところがみつからない
BindしたらListViewがadd/removeを行うので気にしなくて良いです
(実際は若干ことなります)

ちなみにデータを保持しているコレクションをListではなくObservableCollectionにする事で
リストの追加/削除を行うとListViewも自動で追加/削除されるようになります
http://msdn.microsoft.com/ja-jp/library/ms668604.aspx

引用返信 編集キー/
■34617 / inTopicNo.4)  Re[2]: DataContextの更新を反映したい
□投稿者/ 倉田 有大 (518回)-(2009/04/03(Fri) 00:01:36)
囚人さん、noriさん、お返事ありがとうございます。_(__)_おつきあいいただいています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.ComponentModel;
using System.Collections.ObjectModel;



namespace WPFTest3
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public class Data : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;

            private string name;

            public string Name
            {
                get
                {
                    return this.name;
                }
                set
                {
                    this.name = value;
                    OnPropertyChanged("Name");
                }
            }

            protected virtual void OnPropertyChanged(string propertyName)
            { 
              if (this.PropertyChanged == null) return;
                var args = new PropertyChangedEventArgs(propertyName);
              this.PropertyChanged(this, args);
            }            
        }
        
        List<Data> list;

        public Window1()
        {
            InitializeComponent();
            list = new List<Data>();
            list.Add(new Data { Name = "name1" });
            this.listView1.DataContext = list;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            list.Add(new Data { Name = "name2" });
        }
    }
}

<Window x:Class="WPFTest3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ListView Margin="68,66,90,96" ItemsSource="{Binding}" Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="name" DisplayMemberBinding="{Binding Name}"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Height="23" Margin="98,20,106,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button>
    </Grid>
</Window>

上記のように変更しましたが、更新されませんでした。もっと簡単なコードから変更していくべきかなあ。


ObservableCollectionも挑戦中です。

引用返信 編集キー/
■34618 / inTopicNo.5)  Re[3]: DataContextの更新を反映したい
□投稿者/ nori (68回)-(2009/04/03(Fri) 01:22:29)
>List<Data> list;
をObservableCollection<Data> list;
に変更すれば button1のクリックでListViewに行が追加されると思います。 ・・・ (A)
さらに list[0].Name = "変更"; というコードを入れると内容が更新されると思います ・・・(B)

(A)はINotifyCollectionChanged(ObservableCollection)によるもの
(B)はINotifyPropertyChangedによるもの

です。
引用返信 編集キー/
■34619 / inTopicNo.6)  Re[4]: DataContextの更新を反映したい
□投稿者/ 倉田 有大 (519回)-(2009/04/03(Fri) 01:40:38)
2009/04/03(Fri) 01:41:20 編集(投稿者)
noriさん、ありがとうございます_(__)_
下記のコードで動作確認しました!
(A)でINotifyPropertyChangedつかうコードも挑戦してみます。


using System.Collections.ObjectModel;



namespace WPFTest3
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public class Data : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;

            private string name;

            public string Name
            {
                get
                {
                    return this.name;
                }
                set
                {
                    this.name = value;
                    OnPropertyChanged("Name");
                }
            }

            protected virtual void OnPropertyChanged(string propertyName)
            { 
              if (this.PropertyChanged == null) return;
                var args = new PropertyChangedEventArgs(propertyName);
              this.PropertyChanged(this, args);
            }            
        }

        ObservableCollection<Data> list;

        public Window1()
        {
            InitializeComponent();
            list = new ObservableCollection<Data>();
            list.Add(new Data { Name = "name1" });
            this.listView1.DataContext = list;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            list.Add(new Data { Name = "name2" });
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            list[0].Name = "変更"; 
        }
    }
}

<Window x:Class="WPFTest3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ListView Margin="68,66,90,96" ItemsSource="{Binding}" Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="name" DisplayMemberBinding="{Binding Name}"/>
                </GridView>
            </ListView.View>
        </ListView>
        <Button Height="23" Margin="0,26,50,0" Name="button1" VerticalAlignment="Top" Click="button1_Click" HorizontalAlignment="Right" Width="74">Button</Button>
        <Button Height="23" HorizontalAlignment="Left" Margin="40,26,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click">Button</Button>
    </Grid>
</Window>


引用返信 編集キー/
■34620 / inTopicNo.7)  Re[5]: DataContextの更新を反映したい
□投稿者/ 倉田 有大 (520回)-(2009/04/03(Fri) 01:44:54)
2009/04/03(Fri) 18:35:19 編集(投稿者)

しかし、XAML難しいけど面白いですよね。
もっと、勉強するぞっと。

解決済みチェック
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -