2016-12-13 2 views
0

ItemsSource에서 ListView으로 사용되는 항목 개체 중 List<>을 작성했습니다. 내 ListView의 ItemSelected 이벤트에서 해당 항목의 요소 중 하나를 변경하려고합니다. 원래 값은 객체에서 바인딩됩니다.클릭시 ViewCell 요소 변경

itemClass.cs

class itemClass 
{ 
    public itemClass() 
    { 
    } 
    public string valueIWantToChange {get; set;} 
} 

MyPage.cs

public MyPage() 
{ 
    InitializeComponent(); 
    List<itemClass> listOfItems= new List<itemClass>(); 
    itemClass item1= new itemClass { valueIWantToChange = "UnClicked"}; 
    listOfItems.Add(item1); 
    BindingContext = this; 
    lstView.ItemsSource = listOfItems; 

    lstView.ItemSelected += (sender, e) => 
    { 
     if (e.SelectedItem == null) 
     { 
      return; 
     } 

     // The below does nothing but highlights what I am trying to achieve 
     ((itemClass)((ListView)sender).SelectedItem).valueIWantToChange = "Clicked" ; 

     ((ListView)sender).SelectedItem = null; 
    }; 
} 

내 XAML

:

다음 예를 고려하시기 바랍니다

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:myProject="clr-namespace:myProject" 
     x:Class="myProject.MyPage"> 

    <StackLayout> 
     <ListView x:Name="lstView"> 
      <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell> 
       <StackLayout Padding="0" Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"> 
        <Label Text="{Binding valueIWantToChange }" TextColor="Black" FontSize="16" VerticalOptions="Center" HorizontalOptions="Center" Margin="5,5,5,5"/> 
       </StackLayout> 
       </ViewCell> 
      </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 

</ContentPage> 

바인딩 명령과 PropertyChangedEventHandler을 사용하려했지만 성공하지 못했습니다. 이것에 대한 어떤 도움도 크게 감사 할 것입니다.

내가 응용 프로그램의 다른 곳에서 비슷한 방법으로 PropertyChangedEventHandlers를 사용하려고했습니다

편집, 아래를 참조하십시오 :

public double FontXLarge 
    { 
     set 
     { 
      someFontsize = value; 
      OnPropertyChanged("FontXLarge"); 
     } 
     get 
     { 
      someFontsize = scalableFont(10); 
      return someFontsize; 
     } 
    }   

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

을 위의 것과 글꼴 크기를 결합 나를 수 있습니다 글꼴을 스케일링하지만 문자열과 비슷한 것을 사용한다면 ListView의 모든 항목에 영향을 미치지 않을까요?

답변

1

내가 원하는 것을 구현하는 가장 좋은 방법은 ViewModelINotifyPropertyChanged을 사용하는 것입니다. 인터넷 검색을하는 경우 많은 예제를 찾을 수 있습니다. 일반 baseclass에 대한 좋은 링크 중 하나는 this입니다.

필요한 것을 모두 찾으면 알려주세요.

+0

대단히 감사합니다. 많은 답변을드립니다. 실제로 PropertyChangedEventHandler를 사용하여 뷰 모델을 이미 시도했지만 작동하도록 만들지 못했습니다. 아마도 "BindingContext"가 될 수 있습니다. 또한 뷰 모델에서 하나의 변수를 사용하면 모든 목록 항목에 영향을 미칠 것이라고 생각했습니다. – Aphire

+0

** ViewModel **에서는 ObservableCollection <무언가>를 만들거나 각 필드에 대해 'get'과'set' 속성을 구현해야하며 OnPropertyChanged (""); – Enrico

+0

제 편집문을 보아주세요, 제가 방금 조금 더 나은 것을 설명 할 수 있다고 생각합니다. – Aphire