0

私はそのようなwfpフォームを持っています:

public partial class MediaPlayerControlMain : Window
{
    MediaPlayerMain MediaPlayerMain;

    public MediaPlayerControlMain()
    {
        MediaPlayerMain = new MediaPlayerMain();
        InitializeComponent();
    }
}

MediaPlayerMain オブジェクトを使用するユーザー コントロール (PlayList) があります。そのユーザーコントロールには次のものがあります。

public partial class PlayList : UserControl
{
    public MediaPlayerMain MediaPlayer
    {
        get { return (MediaPlayerMain)GetValue(MediaPlayerProperty); }
        set { SetValue(MediaPlayerProperty, value); }
    }

    public static readonly DependencyProperty MediaPlayerProperty =
        DependencyProperty.Register(
            "MediaPlayer", typeof(MediaPlayerMain), typeof(PlayList),
            new FrameworkPropertyMetadata()
        );

}

xaml だけを使用して MediaPlayer プロパティを設定する方法はありますか。「{Binding ElementName=MediaPlayerMain}」を使用しようとしましたが、MediaPlayerMain がまだ初期化されていないようです。InitializeComponent() 関数の前に初期化しましたが。私は何を間違っていますか?. そして、このオブジェクトをユーザー コントロールに渡すための最良のオプションは何ですか?

4

3 に答える 3

1
public partial class MediaPlayerControlMain : Window,INotifyPropertyChanged
    {


        public MediaPlayerControlMain()
        {                
            InitializeComponent();
            MediaPlayerMain = new MediaPlayerMain();
        }
        private MediaPlayerMain mediaPlayerMain;

        public MediaPlayerMain MediaPlayerMain
        {
            get { return mediaPlayerMain; }
            set { mediaPlayerMain = value; Notify("MediaPlayerMain"); }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void Notify(string propName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propName));

        }
    }

 "{Binding MediaPlayerMain RelativeSource={RelativeSource AncestorType=Window}}"

問題は、プロパティではなくフィールドをバインドしようとしていることです。バインドシステムはリフレクションを使用し、フィールドではなくプロパティのみを検索するため、バインドソースはフィールドではなくプロパティである必要があります。これが役立つことを願っています。

于 2013-01-16T13:11:02.767 に答える
1

マークアップでルート要素 (Window/UserControl 自体) に名前を付ける必要があります。すなわち:

<Window x:Name="mediaPlayer"
    ....>
    <TextBlock Text="{Binding SomeProperty,ElementName=mediaPlayer}"
于 2013-01-16T12:53:42.117 に答える
0

どこにも設定していませんし、XAML ツリーに名前がDataContext付けられたオブジェクトがないと思いますMediaPlayerMain

を記述するとき{Binding ElementName=MediaPlayerMain}は、名前が付けられたビジュアル ツリー内の XAML オブジェクトと等しいプロパティを設定するように WPF に指示しています。MediaPlayerMain

おそらく代わりに探しているのは、という名前の DataContext のプロパティにバインドすることです。MediaPlayerMainこの場合、バインディングは次のようになります。

<local:PlayList MediaPlayer="{Binding MediaPlayerMain}" />

ただし、ウィンドウのコンストラクターで設定するなどDataContext、プロパティを含むオブジェクトに設定しない限り、それは機能しません。MediaPlayerMainthis.DataContext = this

別の方法として、バインディングで を使用して、 などElementNameの ではなくビジュアル ツリー内のオブジェクトのプロパティを検索するように WPF に指示することもできます。DataContextWindow

<local:MediaPlayerControlMain x:Name="MainWindow" ...>
    <local:PlayList MediaPlayer="{Binding MediaPlayerMain, ElementName=MainWindow}" />
</local:MediaPlayerControlMain>

これにより、バインディングは、クラスであるMediaPlayerMainという名前の XAML 要素でプロパティを検索します。MainWindowMediaPlayerControlMain

WPF の DataBinding を初めて使用する場合は、私のブログに特に初心者向けの記事があり、それが何であり、どのように機能するかをよりよく理解するのに役立つはずです。

于 2013-01-16T13:51:12.787 に答える