0

次のように、「Employee」というオブジェクトがあります。

class Employee
{
    public string EmpName { get; set; }
    public string Surname { get; set; }

    public Employee(string Name, string Surname) : base()
    {
        this.EmpName = EmpName;
        this.Surname = Surname;
    }

    public Employee()
    {
    }
}

この単純な「EmployeeControl」もここにあります。グリッド内の2つのラベル:

<UserControl x:Class="LabelBindingTest.EmployeeCtrl"
             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" 
             Name="EmpCtrl"
             d:DesignHeight="120" d:DesignWidth="411">
    <Grid>
        <Label Content="{Binding ElementName=EmpCtrl, Path=EmpName}" Height="28" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="81" />
        <Label Content="{Binding ElementName=EmpCtrl, Path=Surname}" Height="28" HorizontalAlignment="Right" Name="label2" VerticalAlignment="Top" Width="81" />
    </Grid>
</UserControl>

(編集)EmployeeControlコードビハインド:

   public partial class EmployeeCtrl : UserControl
    {
        Employee thisEmployee = new Employee();

        public string EmpName
        {
            get
            {
                return thisEmployee.EmpName;
            }

            set
            {
                thisEmployee.EmpName = value;
            }
        }

        public string Surname
        {
            get
            {
                return thisEmployee.EmpName;
            }

            set
            {
                thisEmployee.EmpName = value;
            }
        }


        public EmployeeCtrl()
        {
            InitializeComponent();
        }
    }

今、私がやろうとしているのは、ウィンドウに「EmployeeControl」を追加し、それらをEmployeeオブジェクトにバインドすることです。これが私の「ウィンドウ」コードです。

<Window x:Class="LabelBindingTest.MainWindow"
        Name="myWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:LabelBindingTest">
    <Grid>
        <my:EmployeeCtrl EmpName="Daniel" Surname="Hammond" HorizontalAlignment="Left" Margin="23,26,0,0" x:Name="employeeCtrl1" VerticalAlignment="Top" Height="97" Width="429" />
    </Grid>
</Window>

いろいろ試してみましたが、うまくいきません。正常にコンパイルされますが、ラベルは空です。「Employee」オブジェクトを「EmployeeCtrl」コントロールにアタッチしたいだけです。私がこれをどのように回避するかについてのアイデアはありますか?今日はバインディングについてたくさん読んだのですが、まだ頭を悩ませています。今のところ実行前に従業員名を設定するだけなので、INotifyPropertyChangedを実装する必要があるかどうかはわかりません。

(編集):Caliburn.Microをダウンロードし、最後の回答で同じコードを使用しました。同じ結果、空のウィンドウ。

これがプロジェクト全体です。ただし、この質問にはすべてのコードを貼り付ける必要があります。これは便宜上のものです。

http://www.mediafire.com/?gux3573rz64mupe

4

2 に答える 2

1

まず、アプリケーションがより複雑になるため、MVVM を検討することを強くお勧めします。MVVM を使用している場合は、MVVM フレームワークを使用します。あなたがやっているようなビュー構成をはるかに簡単にするCaliburn.Microをお勧めします。他にも利用可能な MVVM フレームワークがあるので、それらをすべて評価してください。

あなたの問題では、問題は、ユーザー コントロールがそのプロパティを依存関係プロパティとして実装していないことです。XAML では、ユーザー コントロールのEmpNameおよびSurnameプロパティを設定していますが、UI は、ユーザー コントロールの構築後にそれらの値が変更されたことを認識しないため、それ自体を更新しません。

INotifyPropetyChangedMVVM パターンを使用する場合はビュー モデルに実装し、ユーザー コントロールの依存関係プロパティを実装します。これらのテクニックは両方とも、UI に変更を通知し、UI 自体を強制的に更新します。

したがって、ユーザーコントロールに対して次のことができます。

public partial class EmployeeCtrl : UserControl
{
    public static readonly DependencyProperty EmpNameProperty = 
       DependencyProperty.Register("EmpName", typeof(string),
       typeof(EmployeeCtrl), new FrameworkPropertyMetadata(null));

    public static readonly DependencyProperty SurnameProperty = 
       DependencyProperty.Register("Surname", typeof(string),
       typeof(EmployeeCtrl), new FrameworkPropertyMetadata(null));

    public EmployeeCtrl()
    {
        this.InitializeComponent();
    } 

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

    public string Surname
    {
       get { return (string)GetValue(SurnameProperty); }
       set { SetValue(SurnameProperty, value); }
    }
}

この段階ではクラスを使用していないため、実際にはまったく必要ありませんEmployeeが、理想的にはINotifyPropertyChanged、構築後にプロパティ値が変更され、そのインスタンスが UI にバインドされている場合は実装する必要があります。 UIが更新されます。

于 2013-02-18T23:34:02.223 に答える
0

EmployeeCtrl の EmpName および Surname プロパティに INotifyPropertyChanged を実装する必要があります。これは、ラベルがその値を更新できるように、このプロパティ値の値の変更についてこのユーザー コントロールのラベルを更新する必要があるためです。したがって、EmployeeCtrl の EmpName および Surname プロパティに Notify change を実装するか、単にこの 2 つのプロパティに依存関係プロパティを使用する必要があります。お役に立てれば!!!

于 2013-02-19T07:14:11.357 に答える