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

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

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

WPFでlistvewでBindingでの表示方法

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

■86913 / inTopicNo.1)  WPFでlistvewでBindingでの表示方法
  
□投稿者/ 目薬と塩 (1回)-(2018/04/03(Tue) 18:52:45)

分類:[(わからない)] 

はじめまして、VS:2017を使用中の新米エンジニアです。
質問をさせてください。

ListViewでデータをbindingしたものを,別のlistboxに表示させる方法を教えてください。
XAMLとC#でbindingは成功しているのですが、
listviewでcellをクリックした際にtextboxに内容を表示させるようにしたいと
作業しているのですが、うまく行きません。
なにか上手な方法はありませんか?よろしくお願いします。

引用返信 編集キー/
■86914 / inTopicNo.2)  Re[1]: WPFでlistvewでBindingでの表示方法
□投稿者/ Hongliang (626回)-(2018/04/03(Tue) 20:44:48)
ListViewにはセルって単位は存在しなくて、あくまでItem=行単位ですが…。

class VM : INotifyPropertyChanged {
    public ObservableCollection<Item> Items { get; private set; }
    public Item CurrentItem { get; set; } // set時のPropertyChangedは略
}
class Item : INotifyPropertyChanged {
    略
}

<ListView ItemsSource="{Binding Items}"
          SelectedItem="{Binding CurrentItem}">
  略
</ListView>

ここまでは大丈夫だと思いますが、どの辺りが問題でしょうか。

引用返信 編集キー/
■86916 / inTopicNo.3)  Re[2]: WPFでlistvewでBindingでの表示方法
□投稿者/ 目薬と塩 (3回)-(2018/04/03(Tue) 21:37:08)
No86914 (Hongliang さん) に返信
> ListViewにはセルって単位は存在しなくて、あくまでItem=行単位ですが…。
>
> class VM : INotifyPropertyChanged {
> public ObservableCollection<Item> Items { get; private set; }
> public Item CurrentItem { get; set; } // set時のPropertyChangedは略
> }
> class Item : INotifyPropertyChanged {
> 略
> }
>
> <ListView ItemsSource="{Binding Items}"
> SelectedItem="{Binding CurrentItem}">
> 略
> </ListView>
>
> ここまでは大丈夫だと思いますが、どの辺りが問題でしょうか。

ご回答ありがとうございます。
C#の取扱についてです。
XAMLの取扱はわかるのですが、C#でどのように記述すれば良いのか困っています。

ネットで検索後
Selector.SelectionChanged イベント
https://msdn.microsoft.com/ja-jp/library/system.windows.controls.primitives.selector.selectionchanged(v=vs.110).aspx

で行えるようなのですが、C#をどう記述したらいいか
理解出来ずに困っています。

引用返信 編集キー/
■86917 / inTopicNo.4)  Re[3]: WPFでlistvewでBindingでの表示方法
□投稿者/ Hongliang (627回)-(2018/04/03(Tue) 22:21:02)
2018/04/03(Tue) 22:21:36 編集(投稿者)

ListViewのアイテムと、ListBoxのコレクションおよびアイテムの、それぞれのVMにおける関係を、私が示したような模擬クラス的なものでいいんで教えていただけませんか?
引用返信 編集キー/
■86923 / inTopicNo.5)  Re[4]: WPFでlistvewでBindingでの表示方法
□投稿者/ 目薬と塩 (4回)-(2018/04/04(Wed) 09:58:13)
No86917 (Hongliang さん) に返信
> 2018/04/03(Tue) 22:21:36 編集(投稿者)
>
> ListViewのアイテムと、ListBoxのコレクションおよびアイテムの、それぞれのVMにおける関係を、私が示したような模擬クラス的なものでいいんで教えていただけませんか?

かしこまりました。
以下ソースです。

XAML
   
<ListView x:Name="listView2" ItemsSource="{Binding}" Margin="10,147,0,10" Padding="0" HorizontalAlignment="Left" Width="222"
SelectedItem="{Binding CurrentItem}">


   Listview の中身
<DataTemplate x:Key="customerCellTemplate">
<StackPanel>
<Label Content="{Binding CustomerName}" HorizontalAlignment="Left" FontSize="12" Width="Auto" Height="Auto" Padding="0,0,0,-20"/>
<Label Content="{Binding CustomerNameKana}" HorizontalAlignment="Left" FontSize="12" Padding="0,0,0,-20"/>
<Label Content="{Binding CustomerCode}" HorizontalAlignment="Left" FontSize="12" Padding="0,0,0,-20"/>
<Label Content="{Binding CustomerPhoneNumber}" HorizontalAlignment="Left" FontSize="12" Padding="0,0,0,-20"/>
</StackPanel>
</DataTemplate>

 Listviewで表示したいTextbox
  <TextBox HorizontalAlignment="Left" Height="23" VerticalAlignment="Top" Width="120" Margin="264,134,0,0"/>


 C# 
 void PrintText(object sender, SelectionChangedEventArgs args)
 {

 }

これでいいのかわかりませんが、よろしくお願いします。
引用返信 編集キー/
■86927 / inTopicNo.6)  Re[5]: WPFでlistvewでBindingでの表示方法
□投稿者/ Hongliang (628回)-(2018/04/04(Wed) 10:26:14)
あの、ListBoxは
引用返信 編集キー/
■86929 / inTopicNo.7)  Re[6]: WPFでlistvewでBindingでの表示方法
□投稿者/ 目薬と塩 (5回)-(2018/04/04(Wed) 10:43:31)
No86927 (Hongliang さん) に返信
> あの、ListBoxは

ListBoxは作っていないです。
引用返信 編集キー/
■86930 / inTopicNo.8)  Re[7]: WPFでlistvewでBindingでの表示方法
□投稿者/ Hongliang (629回)-(2018/04/04(Wed) 10:50:17)
えーと、つまり最初の投稿の
> ListViewでデータをbindingしたものを,別のlistboxに表示させる方法を教えてください。
のlistboxはTextBoxの誤りだったということでいいでしょうか。

で、ListViewで選んだオブジェクトの、なにがしかのプロパティをTextBoxで表示したいと。

<TextBox Text="{Binding CurrentItem.Hoge}" .../>
でいいんじゃないですか?
引用返信 編集キー/
■86933 / inTopicNo.9)  Re[8]: WPFでlistvewでBindingでの表示方法
□投稿者/ 目薬と塩 (6回)-(2018/04/04(Wed) 11:18:05)
No86930 (Hongliang さん) に返信
> えーと、つまり最初の投稿の
>>ListViewでデータをbindingしたものを,別のlistboxに表示させる方法を教えてください。
> のlistboxはTextBoxの誤りだったということでいいでしょうか。
> 
> で、ListViewで選んだオブジェクトの、なにがしかのプロパティをTextBoxで表示したいと。
> 
> <TextBox Text="{Binding CurrentItem.Hoge}" .../>
> でいいんじゃないですか?

見落としていました。
申し訳ございません。

<TextBox Text="{Binding CurrentItem.Hoge}" .../>
となっていますが、ListViewで選択した項目がうまくBindingされませんでした。なにか
僕の記述にミスはありますか?
 <TextBox Text="{Binding CurrentItem.Hoge}" HorizontalAlignment="Left" Height="23"   VerticalAlignment="Top" Width="120" Margin="264,134,0,0"/>

引用返信 編集キー/
■86935 / inTopicNo.10)  Re[9]: WPFでlistvewでBindingでの表示方法
□投稿者/ Hongliang (630回)-(2018/04/04(Wed) 12:08:16)
正直なところ、ごく一部だけ切り出されても論評しようがありません。
なので、とりあえずこんな感じのサンプルを書いてみました。

<Window x:Class="test.Win"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:local="clr-namespace:test"
        mc:Ignorable="d" 
        Width="300" Height="200"
        d:DesignHeight="300" d:DesignWidth="300">
  <Window.DataContext>
    <local:VM>
      <local:VM.Persons>
        <local:Person Surname="鈴木" GivenName="太郎"/>
        <local:Person Surname="田中" GivenName="次郎"/>
        <local:Person Surname="佐藤" GivenName="三郎"/>
      </local:VM.Persons>
    </local:VM>
  </Window.DataContext>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <ListView Grid.Column="0" Width="150"
              ItemsSource="{Binding Persons}" SelectedItem="{Binding CurrentPerson}">
      <ListView.View>
        <GridView>
          <GridViewColumn Header="姓" DisplayMemberBinding="{Binding Surname}" Width="60"/>
          <GridViewColumn Header="名" DisplayMemberBinding="{Binding GivenName}" Width="60"/>
        </GridView>
      </ListView.View>
    </ListView>
    <StackPanel Grid.Column="1" Margin="4">
      <Grid>
        <Grid.Resources>
          <Style TargetType="TextBox">
            <Setter Property="Width" Value="100"/>
          </Style>
        </Grid.Resources>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto"/>
          <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition/>
          <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" Grid.Column="0">名</Label>
        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding CurrentPerson.Surname}"/>
        <Label Grid.Row="1" Grid.Column="0">名</Label>
        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding CurrentPerson.GivenName}"/>
      </Grid>
    </StackPanel>
  </Grid>
</Window>

namespace test
{
    public partial class Win : Window
    {
        public Win()
        {
            InitializeComponent();
        }
    }

    class NotifyPropertyChanged : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }
    class VM : NotifyPropertyChanged
    {
        private Person m_CurrentPerson;

        public ObservableCollection<Person> Persons { get; } = new ObservableCollection<Person>();
        public Person CurrentPerson
        {
            get { return this.m_CurrentPerson; }
            set
            {
                if (this.m_CurrentPerson == value) return;
                this.m_CurrentPerson = value;
                this.OnPropertyChanged();
            }
        }
    }
    class Person : NotifyPropertyChanged
    {
        private string m_GivenName, m_Surname;
        public string GivenName
        {
            get { return this.m_GivenName; }
            set
            {
                if (this.m_GivenName == value) return;
                this.m_GivenName = value;
                this.OnPropertyChanged();
            }
        }
        public string Surname
        {
            get { return this.m_Surname; }
            set
            {
                if (this.m_Surname == value) return;
                this.m_Surname = value;
                this.OnPropertyChanged();
            }
        }
    }
}

引用返信 編集キー/
■86936 / inTopicNo.11)  Re[10]: WPFでlistvewでBindingでの表示方法
□投稿者/ 目薬と塩 (7回)-(2018/04/04(Wed) 13:59:34)
No86935 (Hongliang さん) に返信
> 正直なところ、ごく一部だけ切り出されても論評しようがありません。
> なので、とりあえずこんな感じのサンプルを書いてみました。
>
> <Window x:Class="test.Win"
> xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
> xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
> xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
> xmlns:local="clr-namespace:test"
> mc:Ignorable="d"
> Width="300" Height="200"
> d:DesignHeight="300" d:DesignWidth="300">
> <Window.DataContext>
> <local:VM>
> <local:VM.Persons>
> <local:Person Surname="鈴木" GivenName="太郎"/>
> <local:Person Surname="田中" GivenName="次郎"/>
> <local:Person Surname="佐藤" GivenName="三郎"/>
> </local:VM.Persons>
> </local:VM>
> </Window.DataContext>
> <Grid>
> <Grid.ColumnDefinitions>
> <ColumnDefinition Width="Auto"/>
> <ColumnDefinition Width="*"/>
> </Grid.ColumnDefinitions>
> <ListView Grid.Column="0" Width="150"
> ItemsSource="{Binding Persons}" SelectedItem="{Binding CurrentPerson}">
> <ListView.View>
> <GridView>
> <GridViewColumn Header="姓" DisplayMemberBinding="{Binding Surname}" Width="60"/>
> <GridViewColumn Header="名" DisplayMemberBinding="{Binding GivenName}" Width="60"/>
> </GridView>
> </ListView.View>
> </ListView>
> <StackPanel Grid.Column="1" Margin="4">
> <Grid>
> <Grid.Resources>
> <Style TargetType="TextBox">
> <Setter Property="Width" Value="100"/>
> </Style>
> </Grid.Resources>
> <Grid.ColumnDefinitions>
> <ColumnDefinition Width="Auto"/>
> <ColumnDefinition Width="Auto"/>
> </Grid.ColumnDefinitions>
> <Grid.RowDefinitions>
> <RowDefinition/>
> <RowDefinition/>
> </Grid.RowDefinitions>
> <Label Grid.Row="0" Grid.Column="0">名</Label>
> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding CurrentPerson.Surname}"/>
> <Label Grid.Row="1" Grid.Column="0">名</Label>
> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding CurrentPerson.GivenName}"/>
> </Grid>
> </StackPanel>
> </Grid>
> </Window>
>
> namespace test
> {
> public partial class Win : Window
> {
> public Win()
> {
> InitializeComponent();
> }
> }
>
> class NotifyPropertyChanged : INotifyPropertyChanged
> {
> public event PropertyChangedEventHandler PropertyChanged;
> protected void OnPropertyChanged([CallerMemberName] string name = null)
> {
> this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
> }
> }
> class VM : NotifyPropertyChanged
> {
> private Person m_CurrentPerson;
>
> public ObservableCollection<Person> Persons { get; } = new ObservableCollection<Person>();
> public Person CurrentPerson
> {
> get { return this.m_CurrentPerson; }
> set
> {
> if (this.m_CurrentPerson == value) return;
> this.m_CurrentPerson = value;
> this.OnPropertyChanged();
> }
> }
> }
> class Person : NotifyPropertyChanged
> {
> private string m_GivenName, m_Surname;
> public string GivenName
> {
> get { return this.m_GivenName; }
> set
> {
> if (this.m_GivenName == value) return;
> this.m_GivenName = value;
> this.OnPropertyChanged();
> }
> }
> public string Surname
> {
> get { return this.m_Surname; }
> set
> {
> if (this.m_Surname == value) return;
> this.m_Surname = value;
> this.OnPropertyChanged();
> }
> }
> }
> }
>


ご丁寧にありがとうございます。
WPFというか、プログラム自体初めてで戸惑っています。
上手に組めないことが多く、途方に暮れていた中親身に
相談に乗っていただきありがとうございました。
再現は出来ませんでしたが、なんとなくの光明は見えた気がしますので、今回で
質問解決済みにさせていただきます。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ