Xamarin表单ListView绑定未更新

问题描述 投票:0回答:1

我有问题。我用ViewModel创建了一个ListView。在我的ListView中,我有一些带有Text的标签,这些标签绑定到ItemSource中的对象。现在,当我更改ObservableCollection中某个项目的ViewModel中的值时,屏幕上没有任何更改!

这是我的ViewModel:

public class VM_DeviceList : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;


    public ICommand cmdDeleteDevice
    {
        get
        {
            return new Command<int>((x) => DeleteDevice_Handler(x));
        }
    }

    public ICommand cmdTogglePower
    {
        get
        {
            return new Command<int>((x) => TogglePower_Handler(x));
        }
    }


    private ObservableCollection<DisplayedDevice> _knownDeviceList;
    public ObservableCollection<DisplayedDevice> knownDeviceList
    {
        get
        {
            return _knownDeviceList;
        }
        set
        {
            if (_knownDeviceList != value)
            {
                _knownDeviceList = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("knownDeviceList"));
                }
            }
        }
    }

这是我的ObservableCollection的课程:

public class DisplayedDevice : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string State { get; set; }
    public string StateShown { get; set; }
    public string deviceImage { get; set; }
    public string Color { get; set; }
    public string PowerStateColor { get; set; }
    public string DeviceImageColor { get; set; }

    public string DeviceImage
    {
        get
        {
            return deviceImage;
        }

        set
        {
            deviceImage = value;
            OnPropertyChanged();
        }
    }
}

这里是xaml:

<ListView ItemsSource="{Binding knownDeviceList}" SelectionMode="None" RowHeight="90" ItemTapped="device_Clicked" x:Name="MyListView">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <AbsoluteLayout HeightRequest="70" Margin="20,10,20,10">
                    <StackLayout Opacity="0.3" BackgroundColor="White"
                        AbsoluteLayout.LayoutBounds="0,0,1,1" 
                        AbsoluteLayout.LayoutFlags="All" />
                    <StackLayout AbsoluteLayout.LayoutBounds="0,0,1,1" 
                        AbsoluteLayout.LayoutFlags="All">
                        <Grid RowSpacing="0">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="35" />
                                <RowDefinition Height="35" />
                            </Grid.RowDefinitions>

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="70" />
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="70" />
                            </Grid.ColumnDefinitions>

                            <Label Grid.Row="0" Grid.Column="1" Text="{Binding Name}" Margin="0,3,0,0"
                        FontAttributes="Bold" FontSize="24" TextColor="White" />
                            <Label Grid.Row="1" Grid.Column="1" Text="{Binding StateShown}" FontSize="18" TextColor="White" />

                            <!-- <Image Source="power" Grid.RowSpan="2" Grid.Column="2" Margin="5" /> -->
                            <controls:IconView x:Name="btnPower" Source="power" Grid.RowSpan="2" Grid.Column="2" Margin="5"
                                            Foreground="{Binding PowerStateColor}">
                                <controls:IconView.GestureRecognizers>
                                    <TapGestureRecognizer Command="{Binding Path=BindingContext.cmdTogglePower, Source={x:Reference MyListView}}" CommandParameter="{Binding Id}" />
                                </controls:IconView.GestureRecognizers>
                            </controls:IconView>
                        </Grid>
                    </StackLayout>
                </AbsoluteLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

现在我期望发生的事情是,当我单击IconView时,我更改了IconView的颜色和带有StateShown绑定的标签。但是当我单击IconView时,什么都没有改变!

我在做什么错?

c# xamarin xamarin.forms xamarin.android xamarin.ios
1个回答
0
投票

您可以使用MVVMHelpers NuGet包并直接从NuGet到DisplayedDevice类实现ObservableObject类,并且需要通过引用私有变量来制作所有属性。

public class DisplayedDevice: ObservableObject
    {

        string _textField = string.Empty;
        public string TextField
        {
            get => _textField;
            set => SetProperty(ref _textField, value);
        }
        bool _isBarChartVisible = false;
        public bool IsBarChartVisible
        {
            get => _isBarChartVisible;
            set => SetProperty(ref _isBarChartVisible, value);
        }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.