2016-12-13 123 views
0

我已經構建了List<>的項目對象,它們被用作ItemsSourceListView。在我的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。如果你在Google上搜索一下,你可以找到很多例子。泛型基類的一個很好的鏈接是this

讓我知道你是否找到你需要的一切。

+0

非常感謝您的回答,非常感謝。實際上我已經用PropertyChangedEventHandler嘗試了一個viewmodel,但是我無法讓它工作,這可能是下面的「BindingContext」。我還認爲,通過在視圖模型中使用一個變量,它會影響所有列表項? – Aphire

+0

在您的** ViewModel **中,您必須創建一個'ObservableCollection '或者爲每個字段實現一個帶有'get'和'set'的屬性並且在集合中使用'OnPropertyChanged(「」);' – Enrico

+0

請參閱我的編輯,我認爲這可能解釋我剛剛說的略好 – Aphire