1

私は、プログラムでエントリコントロールを作成するシナリオを持っています。Messaging Center xamarinを使用して現在のオブジェクト値を設定するためのPCLフォーム

 foreach (var control in FormInfo.FormElementsInfo) 
     { 

     case "textbox": 
         //Some code 
         break; 


     case "dropdown": 

     Entry objDropdown = new Entry(); 
     objDropdown.HeightRequest = 40; 
     objDropdown.StyleId = Convert.ToString(control.ElementId); 
     objDropdown.SetBinding(Entry.TextProperty, "ElementValue",BindingMode.TwoWay); 
     objDropdown.BindingContext = control; 
     layout.Children.Add(objDropdown); 

     MessagingCenter.Subscribe<Picklists, string>(objDropdown, "PicklistSelected", (sender, arg) => 
     { 
      objDropdown.Text = arg; 
    // I tried this too as this is two way binding. It didn't show the value. 

      //control.ElementValue = arg; 



     }); 
     break; 
    } 

これをクリックするとリストビューが表示されます。リストビューでオプションを選択すると、そのデータがエントリに入力されます。 しかし、これは現在のエントリでのみ選択された値を表示するはずですが、すべてのエントリの値を変更しています。

このような状況を回避する方法。選択した値に現在のエントリだけが入力されるようにします。

ご迷惑をおかけして申し訳ございません。ありがとうございました。

===より明確な質問=====

我々はエントリのn個の数を作成する場合は結合2の方法でプログラム的に制御します。他のページで何かを選択する際に、単一の入力値を変更することは可能ですか?はいの場合、これを達成する方法は?

+0

あなたはただ一つの事実を示すだけです。あなたのエントリはすべて同じ値になっていますか?彼らがすべて同じ価値に縛られているならば、私は彼らにすべて変化を反映させることを期待します。 –

+0

@Joshua foreach(FormInfo.FormElementsInfoのvarコントロール) \t \t \t {//上記の場合のステートメント}上記のcase文はこのforループ内にあり、すべてが同じです。各エントリは、Controlという別のオブジェクトにバインドされています。私はMessaging Centerの代わりにDelegateを使用しようとしました。私は同じシナリオを持っています。 – Dev

+0

あなたは機能全体を投稿できますか?実装の残りの部分を見ることなく、私はループがすべてのコントロールを反復していると仮定できます。リストの「選択された」アイテムにどのようにリンクしているのか分かりません。あなたは間違いなくあなたのバインディングをforループで更新すべきではありません。それ以前にバインドすると、値が更新されるだけです。 –

答えて

0

まず第一に私を助けるために時間を割いてあなたに@Joshuaポーリングをありがとうございました。

私はMessagingCenterがこのアプローチには適していないと思います。

私は、作成する各要素に一意のstyleIdを割り当てます。これは、基本的にスタックレイアウト内の位置を保存します。

私は選択された値と要素の位置を返すデリゲートを作成しました。要素は常にこのイベントを発生させるEntryです。私はこれを達成するために以下のコードを使用しました。

エントリmyentry =(Xamarin.Forms.Entry)layout.Children [src.ElementId];

0

public class FormInfo 
{ 
    public List<FormsElementInfo> FormElementsInfo { get; set; } 
} 

FormInfo FormsElementInfo

public class FormsElementInfo : INotifyPropertyChanged 
{ 
    private string _elementValue; 
    public string ElementValue { 
     get => _elementValue; 
     set { 
      if(_elementValue != value) 
      { 
       _elementValue = value; 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ElementValue")); 
      } 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

コンテンツページ

public class ListStackOverflow : ContentPage 
{ 
    private FormInfo _info = new FormInfo 
    { 
     FormElementsInfo = new List<FormsElementInfo>() 
     { 
      new FormsElementInfo { ElementValue = "test 1"}, 
      new FormsElementInfo { ElementValue = "test 2"}, 
      new FormsElementInfo { ElementValue = "test 3"}, 
      new FormsElementInfo { ElementValue = "test 4"}, 
     } 
    }; 
    private StackLayout _stack = new StackLayout(); 
    private List<string> _source = new List<string> 
    { 
     "output 1","output 2","output 3","output 4", 
    }; 

    public ListStackOverflow() 
    { 
     //BindingContext = _info; 

     foreach(var c in _info.FormElementsInfo) 
     { 
      Entry tempEntry = new Entry 
      { 
       HeightRequest = 40, 
       Placeholder = c.ElementValue, 
       BindingContext = c 
      }; 
      tempEntry.SetBinding(Entry.TextProperty, "ElementValue"); 

      _stack.Children.Add(tempEntry); 
     } 
     ListView _lv = new ListView { ItemsSource = _source }; 
     _lv.ItemSelected += Lv_ItemSelected; 


     _stack.Children.Add(_lv); 

     Content = _stack; 
    } 

    private void Lv_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
    { 
     var selectedElement = e.SelectedItem.ToString(); 
     var index = _source.IndexOf(selectedElement); 
     var entry = _info.FormElementsInfo[index]; 
     entry.ElementValue = selectedElement; 
    } 
} 

出力

リストビューで対応するインデックスを選択すると、同じインデックスの "ElementValue"が更新されます。

Output

関連する問題