1

各フィールドが通常の方法で個別に生成されるクラスで作成されるフィールドでアプリケーションを動作させました

public class RequestProfileObject : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;

     private string strPassword;
     public string Pwd
     { 
         get { return strPassword; }
         set 
         { 
             strPassword = value; 
             // Call OnPropertyChanged whenever the property is updated 
             OnPropertyChanged("Pwd"); 
         } 
     }

     //Plus other code to load the data into the field and the OnPropertyChanged
     //method 
}

その後、変更を追跡できるようにする必要があることがわかり、そのためのメカニズムと必要なその他の機能を考え出しました。言うまでもなく、これらのオブジェクトのクラスを作成するという素晴らしいアイデアを思いついたコードの繰り返し。

public class ETLBaseField  : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string strFieldPrime;
    private string strField;
    private string strFieldName;

    public ETLBaseField() { }

    public ETLBaseField(string strInputField)
    {
        strFieldName = strInputField;
    }

    public string Field
    {
        get { return strField; }
        set
        {
            if (strField != value)
            {
                strField = value;
                // Call OnPropertyChanged whenever the property is updated
                OnPropertyChanged(strFieldName);
            }
        }
    }

    public void Load(string strValue)
    {
        strFieldPrime = strValue;
        strField = strFieldPrime;
    }

    public void Empty()
    {
        Load("");
    }

    public bool isDirty()
    {
        return strFieldPrime != Field;
    }

    protected void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

このクラスは私のメインクラスで使用されています

public class RequestProfileObject : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;

     public ETLBaseField RequestName = new ETLBaseField("RequestName");
     public ETLBaseField InterfaceName = new ETLBaseField("InterfaceName");

    //Plus code that loads the ETLBaseField things and the OnPropertyChanged method
}

私の xaml コードは機能していましたが、フィールドへのバインディングはかなり面倒でした。私の新しい発明では、RequestName.Field プロパティを xaml テキストボックスにバインドする方法がわかりません。以下

<TextBox Height="23" Name="txtBxInterfaceName" Width="250" 
 Text="{Binding Path=InterfaceName.Field}" />

動作しません。ETLBaseField クラスを作成するのに、私は頭が良すぎたのでしょうか? RequestProfileObject から INPC を削除する必要がありますか?

4

2 に答える 2

1

使用モード = 双方向

<TextBox Height="23" Name="txtBxInterfaceName" Width="250" 
     Text="{Binding Path=InterfaceName.Field, Mode=TwoWay}" />

ETLBaseField が INotifyPropertyChanged を実装しているため、DataBinding は機能するはずです。うまくいかない場合は、TextBox の DataContext を明示的に設定してみてください

<TextBox DataContext="{Binding InterfaceName}" Height="23" Name="txtBxInterfaceName" Width="250" 
 Text="{Binding Field}" />

OnPropertyChangedあなたは間違って上げています!

これではない

OnPropertyChanged(strFieldName);

代わりにこれを行う

OnPropertyChanged("Field");
于 2013-05-21T03:02:21.570 に答える
0

Getter で InterfaceName を Property に変換する必要があると思います。あなたの例のようにフィールドで動作するとは思いません。だから、これを試してください:

private ETLBaseField _interfaceName;
public ETLBaseField InterfaceName
{
  get{return _interfaceName??(_interfaceName = new ETLBaseField("InterfaceName"));
  set{_interfaceName = value;}
}

使用したくない場合は、Setter は必要ないかもしれません。

于 2013-05-21T02:50:41.113 に答える