1

ユーザーコントロールをメインウィンドウのオブジェクトにバインドする際に問題があります。何が悪いのかわかりません。

編集可能なテキスト ボックスを持つカスタム コントロール MyUserControl を作成しました

MyUsrControl.xaml

<UserControl x:Class="UserControlToObject.MyUsrControl"
             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"              
             mc:Ignorable="d" 
             d:DesignHeight="70" d:DesignWidth="200">    
    <StackPanel Orientation="Horizontal">
        <Label Grid.Row="0" Grid.Column="0" Margin="5">Name</Label>            
        <TextBox Grid.Row="0" Grid.Column="1" Margin="5" Name="tbxName"></TextBox>
    </StackPanel>
</UserControl>

次に、国外でこのテキストボックスを変更できるように DP を定義しました

MyUsrControl.xaml.cs

namespace UserControlToObject
{
    public partial class MyUsrControl : UserControl
    {
        public static readonly DependencyProperty EmpNameProperty = DependencyProperty.Register("EmpNameProperty", typeof(string), typeof(MyUsrControl),           
                               new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, EmpNamePropertyChanged));

        public string EmpName
        {
            get
            {
                return (string)GetValue(EmpNameProperty);
            }
            set
            {
                SetValue(EmpNameProperty, value);
            }
        }

        public MyUsrControl()
        {
            InitializeComponent();            
        }

        static void EmpNamePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            MyUsrControl x = (MyUsrControl)sender;
            x.tbxName.Text = (string)e.NewValue;
        }
    }
}

次に、Employee クラスを定義しました。このクラスのオブジェクトのプロパティがユーザー コントロールに表示されます。

namespace UserControlToObject
{
    /// <summary>
    /// Employee class
    /// </summary>
    class Employee : INotifyPropertyChanged
    {
        string m_name, m_surname;

        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Employee name property
        /// </summary>
        public string Name
        {
            get { return m_name; }
            set
            {
                m_name = value;
                OnPropertyChanged("Name");
            }
        }

        /// <summary>
        /// Employee surname property
        /// </summary>
        public string Surname
        {
            get { return m_surname; }
            set
            {
                m_surname = value;
                OnPropertyChanged("Surname");
            }
        }

        public Employee()
        {
            m_name = "unknown name";
            m_surname = "unknown surname";
        }

        public Employee(string name, string surname)
        {
            m_name = name;
            m_surname = surname;
        }    

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

    }

そして最後に MainWindow.xaml

<Window x:Name="myApp" x:Class="UserControlToObject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:UserControlToObject"        
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <local:MyUsrControl x:Name="ucEmp" EmpName="{Binding Name}"></local:MyUsrControl>
        <Label Content="{Binding ElementName=ucEmp, Path=EmpName}"></Label>

    </StackPanel>
</Window

>

MainWindow.xaml.cs

namespace UserControlToObject
{
    public partial class MainWindow : Window
    {
        Employee anEmployee;

        public MainWindow()
        {
            InitializeComponent();
            anEmployee = new Employee("John", "Wayne");

            this.DataContext = anEmployee;         
        }

    }

}

この行は機能しません (DependencyObject の DependencyProperty でのみバインディングを設定できるというエラー):

<local:MyUsrControl x:Name="ucEmp" EmpName="{Binding Name}"></local:MyUsrControl>

以下の設定は機能するので、Employee クラスに問題があると思います (sth がありませんか?)

<local:MyUsrControl x:Name="ucEmp" EmpName="John"></local:MyUsrControl> --> set EmpName ok
<Label Content="{Binding ElementName=ucEmp, Path=EmpName}"></Label> --> get EmpName ok

誰が間違っているのかわからないので、助けてくれるととても助かります

私は同じことをしましたが、ユーザーコントロールの代わりに TextBox をバインドしましたが、問題はありませんでした。TextBox.Text は、私の Employee.EmpName と同じ依存関係プロパティです。

4

2 に答える 2

4

依存関係プロパティを登録するときは、XAML で使用する名前を使用する必要があります。あなたの場合、これはそうではEmpNameありませんEmpNameProperty

public static readonly DependencyProperty EmpNameProperty = DependencyProperty.
    Register(nameof(EmpName), typeof(string), typeof(MyUsrControl), new 
    FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.
    BindsTwoWayByDefault, EmpNamePropertyChanged));
于 2013-09-02T09:56:52.157 に答える
0

プロパティ登録の「EmpNameProperty」は「EmpName」である必要があります。

ありがとう

于 2013-09-02T10:01:20.843 に答える