0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WPF データバインディング

Posted at

#はじめに
WPF学習中のため自分用に記載していきます。
間違い、不足などありましたらコメントをよろしくお願いします。

#●UpdateSourceTrigger プロパティ
Bindingソースの更新タイミングを決定する。

内容
UpdateSource メソッドを呼び出すときにのみ、ソースを更新する
LostFocus (Default) フォーカスが外れたタイミングでソースを更新する
PropertyChanged ターゲットのプロパティが変更されるたびに、ソースを即時更新する
View.xmal
<DockPanel Margin="10" DockPanel.Dock="Bottom">
    <Button Command="{Binding AddCommand}" Content="Add" DockPanel.Dock="Right" IsDefault="True" />
    <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
</DockPanel>
ViewModel.cs
private string text;
public string Text
{
    get => text;
    set
    {
      if (RaisePropertyChangedIfSet(ref text, value))
      {
         // コマンドが実行可能かどうかが変化したことを通知する
         // TextBoxの値が変更される度、実行される
         AddCommand.RaiseCanExecuteChanged();
      }
   }
}

#●ObservableCollectionを使用したBinding
ObservaleCollectionはINotifyCollectionChangedインターフェースがデフォルトで実装されているため、追加・削除などの変更操作をデータバインディングのターゲットと同期をとることができる。

View.xaml
<DockPanel>
    <Button Content="Add" Command="{Binding AddCommand}" DockPanel.Dock="Bottom"/>

    <ListBox ItemsSource="{Binding PersonList}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock>
            <Run Text="{Binding Name}"/>
            <Run Text="{Binding Age}"/>
            <Run Text="{Binding Country}"/>
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</DockPanel>
MainWindowViewModel.cs
public class MainWindowViewModel : ViewModel
{
    // Personリスト:ObservableCollection
    public ObservableCollection<Person> PersonList { get; private set; } = new ObservableCollection<Person>();

    // 追加ボタン
    private ViewModelCommand addCommand;
    public ViewModelCommand AddCommand => addCommand ??= new ViewModelCommand(AddPerson);

    // Personの追加
    private void AddPerson()
    {
        PersonList.Add(new Person(){Name="すずき", Age=40, Country="日本" });
    }

    public MainWindowViewModel()
    {
        PersonList.Add(new Person() { Name = "マイク", Age = 20, Country = "アメリカ" });
        PersonList.Add(new Person() { Name = "たなか", Age = 25, Country = "日本" });
        PersonList.Add(new Person() { Name = "リー", Age = 30, Country = "中国" });
    }
}

上のソースを実行すると、MainWindowViewModel()で追加している人物がListBoxに表示されている。
 

追加ボタンを押下すると、AddPerson()が実行され「すずき」がListBoxに追加される。
ObservableCollectionを使用しているので、コレクションの追加、削除などを実行すると画面の表示も更新される。


#・環境
VisualStudio2019
.Net Core3.0
Livet v3.2.1

#・参照
[UpdateSourceTrigger 列挙型]
(https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.data.updatesourcetrigger?view=net-5.0)

WPF4.5入門 その55 「Binding その1」 かずきのBlog@hatena

[UpdateSourceTrigger 列挙型]
(https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel.observablecollection-1?view=net-5.0)

WPF4.5入門 その56「コレクションのバインディング」 かずきのBlog@hatena

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?