0

アクティビティにあるデータグリッドにコンボ ボックスがあります。コンボボックスの選択に基づいて、別のグリッドにプログラムでコントロールを設定します。ユーザーは、これらのコントロールにデータを入力して保存します。コンボ ボックスがバインドされているオブジェクトには多くのプロパティがあり、そのうちの 2 つが選択された値のパスと表示メンバーのパスで使用されます。データは、コンボ ボックスの双方向バインディングを使用してバインドされます。ワークフローに配置された保存済みアクティビティが再度開かれると、データが正しく再ロードされ、正しいオブジェクトの値がコンボ ボックスに設定されます。ただし、UI レンダリングでは、コンボ ボックスに関連付けられている値のみがそのまま残ります (つまり、選択された値のパスと表示メンバーのパスにある値)。残りはリセットされます。

なぜこれが起こっているのでしょうか?

PS:バインドを に設定するOneTimeと取得の問題は解決しますが、読み込み後に UI に加えられた変更は反映されません。

コード ビハインド:

public ObservableCollection<MyRule> AllRules {get;set;}
public MyRule myRule{get;set;}

datagrid Loaded Event で、AllRules を次のように入力します。

AllBusinessRules.Add(new MyRule () { RuleId = item.Id, RuleName = item.Name});

ここでitem.Id、 とitem.Nameは、サービス コールを介してデータベースから取得されます。

同じイベントで、以前に保存したルールも次のようにロードした場合:

myRule=SelectedRule; 

どこSelectedRuleRuleId, RuleName, Inputs and Outputsもあります。

コード:

     <ComboBox  
        ItemsSource="{Binding Path=AllRules}"
       SelectedItem="{Binding Path=myRule,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
        SelectedValuePath="RuleId" 
        DisplayMemberPath="RuleName">
        <DataTemplate>
            <TextBox Text="{Binding Path=myRule.RuleName}"/>
        </DataTemplate>

    </ComboBox>

クラス:

  public class MyRule{
    public int RuleId{get;set;}
    public string RuleName{get;set;}
    public List<string> Inputs{get;set;}   //properties that are reset when the UI renders
    public List<string> Outputs{get;set;}  //properties that are reset when the UI renders
    
    }

Inputs プロパティと Outputs プロパティは、リフレクションを介してプログラムで生成されたコントロールから取得され、コンボボックスによって取り込まれたオブジェクトに追加されて保存されます。

ここでこの問題について調べましたが、解決策は私の問題を解決しません。どんな助けでも素晴らしいでしょう。

4

2 に答える 2

0

何が間違っていたのかを調査するのに多くの時間がかかりましたが、今では非常に単純であることがわかりました.

データグリッドのLoadedイベントItemsSourceではコンボ ボックスの を設定し、アイテム ソースではプロパティRuleIdとのみを設定したことを示しRuleNameました。

問題: したがって、コンボボックスのリロード時に選択した値などの値を割り当てたときにmyRule=SelectedRule、他のプロパティ、つまり入力と出力が ItemsSource に存在しないという問題がありました。そのため、SelectedItem は Combo Box の ItemsSource からのものであったため、選択されたオブジェクトは正しくても入力と出力を持たず、双方向バインディングがコンボ ボックスにバインドされていないプロパティの値を何らかの形でリセットしたという印象を与えました。

解決策:最後に、オブジェクトをieMyRuleのような別のオブジェクト にラップしましたRuleInformation

public class RuleInformation{
public List<string>  Inputs;
public List<string>  Outputs;
public MyRule myRule{get;set;} 

}

どこMyRuleに似ています:

public class MyRule{
public int RuleId{get;set;}
public string RuleName{get;set;}
}

したがって、コンボ ボックスはMyRuleオブジェクトにバインドされますが、入力と出力のプロパティは上部のオブジェクトではそのまま残ります。

于 2016-01-11T17:56:26.160 に答える