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

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

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

Re[4]: WPF(VB.NET)の自前U/Cにプロパティを追加したい


(過去ログ 157 を表示中)

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

■90877 / inTopicNo.1)  WPF(VB.NET)の自前U/Cにプロパティを追加したい
  
□投稿者/ さしみ (1回)-(2019/05/10(Fri) 01:05:00)

分類:[VB.NET/VB2005 以降] 

WPF(VB.NET版)で自前で実装したUserControlに独自のプロパティを実装したいのですが、
MainWindow.xaml(呼び出し元)で

<Local:UserControl Id="text"/>

のように書いて実行しても反映されません。

以下に現状のVB.NETのコードを記載します。

Imports System.Windows
Imports System.Windows.Controls

Partial Public Class  UserControl1

    Inherits UserControl
    Private _id As String
    Public Property Id
        Get
            Return _id
        End Get
        Set
            If Value <> _id Then
                _id = Value 'デバッグ時にここでValueが "text" になっていることは確認済み
                '--ここに"Id"の値を書き換える何かが必要なはず--
            End If
        End Set
    End Property

    Public Sub New()
            InitializeComponent()
        CType(Me.Content, FrameworkElement).DataContext = Me
    End Sub

End Class


特に書き方にこだわりはないので、全く別のやり方で解決できるのであればその方法もご教授いただきたいです。

引用返信 編集キー/
■90878 / inTopicNo.2)  Re[1]: WPF(VB.NET)の自前U/Cにプロパティを追加したい
□投稿者/ Hongliang (792回)-(2019/05/10(Fri) 01:56:28)
2019/05/10(Fri) 02:08:13 編集(投稿者)

記述からするに、そのユーザコントロール内のUI要素にIdをBindingしているプロパティがあるが、そのプロパティに設定されないってことでしょうか。

バインディングソースからバインディングターゲットに変更を通知するにはいくつか手段がありますが、UserControlの場合は一般に依存関係プロパティを使用します。
記述方法はとりあえず依存関係プロパティで検索してみて下さい。
で、Idプロパティを依存関係プロパティとして実装して下さい。
引用返信 編集キー/
■90880 / inTopicNo.3)  Re[2]: WPF(VB.NET)の自前U/Cにプロパティを追加したい
□投稿者/ ぶなっぷ (197回)-(2019/05/10(Fri) 10:31:59)
話を分かりやすくするために、以下のXAMLだと仮定します。

<Local:UserControl Id="{Binding text}"/>

このXAMLに出てくるプロパティは2つあります。

Id と text です。
Bindingの左辺に当たるのがId、
Bindingの右辺に当たるのがtextです。

さしみさんが記述している、IdプロパティはCLRプロパティといって、
右辺側にしか指定できないプロパティです。

左辺に指定できるのは、依存関係プロパティという、特殊なプロパティ
だけです。
依存関係プロパティについて語るには、掲示板では無理があります
(話す量が多すぎ)ので、ネットサーフィンしてみてください。
引用返信 編集キー/
■90891 / inTopicNo.4)  Re[3]: WPF(VB.NET)の自前U/Cにプロパティを追加したい
□投稿者/ さしみ (2回)-(2019/05/10(Fri) 23:38:24)
Hongliangさま、ぶなっぷさま、ご教授ありがとうございました。

依存関係プロパティについて調べてみてひとまず目的の動作をするコードかできました。

Imports System.Windows
Imports System.Windows.Controls

Partial Public Class UserControl1

    Inherits UserControl

    Public ReadOnly IdProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("Id", GetType(String), GetType(aaz))

    Private _id As String

    Public Property Id As String
        Get
            Return _id
        End Get
        Set(ByVal Value As String)
            If Value <> _id Then
                _id = Value
            End If
            Me.SetValue(IdProperty, Value)
        End Set
    End Property

    Public Sub New()
        InitializeComponent()
        CType(Me.Content, FrameworkElement).DataContext = Me
    End Sub

End Class


ここでさらに疑問が増えたのですが、Idの値がプログラム起動時に決まるようにプログラムを組んだ時に
_idに関する処理をすべて消しても特に問題なく動いたのですが、この"Set"や"Get"の部分は
プログラム実行中に動的にIdの値を変化させたいときのみ必要ということで合っていますか?

引用返信 編集キー/
■90892 / inTopicNo.5)  Re[4]: WPF(VB.NET)の自前U/Cにプロパティを追加したい
□投稿者/ Hongliang (793回)-(2019/05/11(Sat) 09:45:27)
> DependencyProperty.RegisterAttached("Id", GetType(String), GetType(aaz))
RegisterAttachedは添付プロパティを定義する時に使用するメソッドです。
通常の依存関係プロパティであればRegisterメソッドで良いでしょう。
また第3引数は通常は定義するクラスなので、この場合UserControl1にすべきです。

> Private _id As String
依存関係プロパティでは、通常のプロパティと違って自分で対応するフィールドを管理しません。
なのでこれは不要です。

> Get
>     Return _id
> End Get
依存関係プロパティの値はGetValue(IdProperty)で取得します。
(Object型なのでキャストが必要ですが)

> ここでさらに疑問が増えたのですが、Idの値がプログラム起動時に決まるようにプログラムを組んだ時に
> _idに関する処理をすべて消しても特に問題なく動いたのですが、この"Set"や"Get"の部分は
> プログラム実行中に動的にIdの値を変化させたいときのみ必要ということで合っていますか?
疑問の内容が良く読み取れませんでしたが、上述の_idは不要というのが答えになりますでしょうか。
外部からでもSetProperty(UserControl1.IdProperty, "hoge")などとして
依存関係プロパティの値を設定できるので、IdのSetを経由しない可能性があります。
そのためSetで_idを設定しているからと言って、依存関係プロパティとしてのIdの値と
_idの値は一致しない状況が発生し得ます。

単純にProperty Idが必要ないかという質問であれば、慣習的に書いておいた方が良いでしょう。
実装としてはGetValue/SetValueを呼び出すだけですが。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -