【问题标题】:after implementing iNotifypropertychanged in ViewModel SelectedItem is not working on listview在 ViewModel SelectedItem 中实现 iNotifypropertychanged 后,在 listview 上不起作用
【发布时间】:2020-08-22 22:39:06
【问题描述】:

您好,我在 Xamarin Forms 中使用 MVVM。我正在尝试将我的 Listview 的 SelectedItem 绑定到我的 ViewModel。我绑定了它并且工作正常。但是当我实现 INotifyPropertyChanged 来更新其他组件的视图时,它停止工作了。

即使在我的 ViewModel 中实现了 INotifyPropertyChanged,我也希望它能够工作。我正在弄清楚它为什么会发生的问题。我搜索了互联网和 Xamarin 的文档,但找不到原因。

我的观点

<ListView ItemsSource="{Binding PersonsList}"
          CachingStrategy="RecycleElement"
          HasUnevenRows="True"
          SelectionMode="None"
          SelectedItem="{Binding SelectedPerson}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="5">
                        <Label Text="{Binding FullName}" 
                           FontSize="Medium" 
                           TextColor="Orange"/>

                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

视图模型

 public class PersonViewModel : INotifyPropertyChanged
{
    public PersonViewModel()
    {
        PersonsList = new ObservableCollection<User>
        {
            new User(){ UserId = 1, FullName = "John" },
            new User(){ UserId = 2, FullName = "Alex" },
            new User(){ UserId = 3, FullName = "Ellen" },
            new User(){ UserId = 4, FullName = "Grace" }
        };
    }
    public ObservableCollection<User> PersonsList { get; set; }

    private User _selectedPerson { get; set; }
    public User SelectedPerson
    {
        get { return _selectedPerson; }
        set
        {
            if (_selectedPerson != value)
            {
                _selectedPerson = value;
               OnPropertyChanged();
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

型号

public class User
{
    public int UserId { get; set; }
    public string FullName { get; set; }
}

希望得到一些有用的建议。

【问题讨论】:

  • 你的 setter 都没有调用 PropertyChanged,所以你并没有真正使用 INPC。
  • 我更新了我的问题。我已经添加了属性更改,但它仍然没有检测到所选项目。

标签: c# .net xamarin mvvm xamarin.forms


【解决方案1】:

将您的SelectedPerson 属性更改为调用OnPropertyChanged()

private User _selectedPerson { get; set; }
public User SelectedPerson
{
    get { return _selectedPerson; }
    set
    {
        if (_selectedPerson != value)
        {
            _selectedPerson = value;
            OnPropertyChanged();
        }
    }
}

【讨论】:

  • 我更新了我的问题。我已经添加了属性更改,但它仍然没有检测到所选项目。
  • 尝试将SelectionMode明确设置为Single。此外,挂钩ItemTapped 和“ItemSelected”以确保ListView 实际上正在注册选择。选择项目时,您是否看到任何 UI 变化?
  • 感谢@ottermatic,它正在与 SelectionMode 一起工作,但它正在获得选择颜色。我知道一种添加自定义渲染以删除的方法。有没有办法摆脱它。我使用 SelectionMode 的原因是这个选择颜色。
  • 没有简单的方法可以删除或更改选择颜色。您需要使用自定义渲染器或对于 android,您需要在 styles.xml: &lt;item name="android:colorPressedHighlight"&gt;@color/ListViewSelected&lt;/item&gt; &lt;item name="android:colorLongPressedHighlight"&gt;@color/ListViewHighlighted&lt;/item&gt; &lt;item name="android:colorFocusedHighlight"&gt;@color/ListViewSelected&lt;/item&gt; &lt;item name="android:colorActivatedHighlight"&gt;@color/ListViewSelected&lt;/item&gt; &lt;item name="android:activatedBackgroundIndicator"&gt;@color/ListViewSelected&lt;/item&gt; 中设置所有这些
  • 你可以看到我大部分都使用相同的颜色。您也可以立即将SelectedItem 设置为null 以立即删除突出显示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2010-10-20
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
相关资源
最近更新 更多