2016-12-13 11 views
0

ItemsSourceListViewとして使用されているアイテムオブジェクトのList<>を作成しました。 ListViewのItemSelectedイベントで、その特定の項目の要素の1つを変更しようとしています。元の値はオブジェクトからバインドされています。クリック時の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を使用するのが最善の方法だと思います。あなたが少しグーグルをしている場合、あなたは多くの例を見つけることができます。一般的なベースクラスの良いリンクの1つはthisです。

必要なものがすべて見つかりましたら教えてください。

+0

お返事ありがとうございました。私は実際にPropertyChangedEventHandlerでビューモデルを試しましたが、動作させることができませんでした。これはおそらく "BindingContext"になる可能性があります。私はまた、ビューモデルに1つの変数を持たせることで、すべてのリスト項目に影響を与えると考えましたか? – Aphire

+0

** ViewModel **ではObservableCollection を作成するか、各フィールドに対して 'get'と' set'を持つプロパティを実装し、 'OnPropertyChanged(" ");' – Enrico

+0

私の編集を参照してください、私はちょうどちょっと言ったものを説明するかもしれないと思います – Aphire

関連する問題