1

프로그래밍 방식으로 입력 컨트롤을 만드는 시나리오가 있습니다.메시징 센터 xamarin 양식을 사용하여 현재 개체 값을 설정합니다.

 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 for 루프 내에 있고 모든 것이 동일합니다. 각 항목은 Control이라는 별도의 개체에 바인딩됩니다. 메시징 센터 대신 델리게이트를 사용하려고했는데 그 시나리오도 마찬가지였습니다. – 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