Как узнать, какой переключатель Toogled в ListView и как создать и обработать его в ViewModel? - PullRequest
0 голосов
/ 06 марта 2019

Board.xaml

                <ListView ItemsSource="{Binding SwitchesList}" HasUnevenRows="True" SeparatorColor="White">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout Orientation="Horizontal" Padding="5" BackgroundColor="Transparent">
                                <Image Source="{Binding ImageURL}"></Image>
                                <StackLayout HorizontalOptions="StartAndExpand" VerticalOptions="Center">
                                    <Label Text="{Binding Name}" FontSize="22" TextColor="White" VerticalOptions="Center"></Label>
                                </StackLayout>
                                <Switch x:Name="{Binding Name}" IsToggled="{Binding State, Mode=TwoWay}" Toggled="Switch_Toggled"></Switch>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Board.xaml.cs

public Board ()
    {
        InitializeComponent ();
        var switchModel = new SwitchModel();
        BindingContext = switchModel;


    }

SwitchModel as ViewModel

public class SwitchModel : INotifyPropertyChanged
{
    public List<SwitchDTO> SwitchesList { get; set; }


    public SwitchModel()
    {
        SwitchesList =new List<SwitchDTO>
        {
            new SwitchDTO { Name = "FanSwitch", ImageURL = "windmill.png" ,State=true},
            new SwitchDTO { Name = "LightSwitch", ImageURL = "plug.png" ,State=false},
            new SwitchDTO { Name = "Switch3", ImageURL = "light.png" ,State=true}
        };
    }


    string _Name;

    public string Name
    {
        get
        {
          return _Name;
        } set
        {
            _Name = value;
        }
    }




    //bool _isOwned;

    //public event PropertyChangedEventHandler PropertyChanged;

    //public bool IsOwned
    //{
    //    get
    //    {
    //        return _isOwned;
    //    }
    //    set
    //    {
    //        _isOwned = value;
    //        var c = Name;

    //        // Do any other stuff you want here
    //    }
    //}




}

Я создал переключатели динамически в представлении списка с помощью модели представления. Проблема заключается в том, как инициировать событие переключателя в модели представления и узнать, какой переключатель переключается со значением On или Off.

Если я использую код позади переключателя, событие щелкается каждый раз, когда строка связывается в представлении списка моделей

Как я могу узнать, что переключатель вентилятора или света переключен на мой взгляд Модель, я посмотрел много примеров как https://forums.xamarin.com/discussion/126130/how-to-get-the-id-of-the-toggled-switch-item-in-the-listview, но ни один из них не дает достаточно информации, как это сделать без написания кода в коде позади, пример

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете узнать, какой переключатель переключается, добавив следующий код к вашему Board.xaml.cs

    void Switch_Toggled(object sender, EventArgs args)
    {
        Switch sw1 = sender as Switch;

        ViewCell vc1 = sw1.Parent.Parent as ViewCell;
        SwitchDTO model = vc1.BindingContext as SwitchDTO;
        Console.WriteLine(model.Name);
        Console.WriteLine(model.State);
        Console.WriteLine(model.ImageURL);
    }

Если вы действительно не хотите использовать код позади, вы можете привязать некоторое свойство к тому же значениюсвойства IsToggled переключателя:

         <ViewCell>
                <StackLayout Orientation="Horizontal" Padding="5" BackgroundColor="Transparent">
                    <Image Source="{Binding ImageURL}"></Image>
                    <StackLayout HorizontalOptions="StartAndExpand" VerticalOptions="Center">
                        <Label Text="{Binding Name}" FontSize="22" TextColor="Blue" VerticalOptions="Center" 
                            IsVisible="{Binding State}"></Label>
                    </StackLayout>
                    <Switch x:Name="switch1" IsToggled="{Binding State}" Toggled="Switch_Toggled" ></Switch>
                </StackLayout>
            </ViewCell>
...