CollectionView, SelectedItems="{Binding SelectedElement, Mode=TwoWay}" 无效
CollectionView, SelectedItems="{Binding SelectedElement, Mode=TwoWay}" Didn't work
我试图在我的视图和我的 ViewModel 之间绑定我的 CollectionView 的“SelectedItems”属性。但是 TwoWay 没有用。
我可以将信息发送到我的视图,但我无法将信息发送到我的视图模型。
(所有其他出价均正常工作)
一些代码,在我的 ViewModel 中:
private ObservableCollection<Element> _selectedElement;
public ObservableCollection<Element> SelectedElement
{
get
{
return _selectedElement;
}
set
{
if (_selectedElement != value)
{
_selectedElement = value;
}
}
}
在我看来
<CollectionView ItemsSource="{Binding Elements,Mode=TwoWay}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedElement, Mode=TwoWay}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal" >
<StackLayout Padding="15,10" Orientation="Horizontal" >
<Label Text="{Binding Libelle}" VerticalOptions="Center" />
<Label Text="{Binding Code}" VerticalOptions="Center" />
</StackLayout>
<StackLayout HorizontalOptions="EndAndExpand" VerticalOptions="Center" >
<ImageButton Source="{Binding ImgFavori}"
BackgroundColor="Transparent"
Command="{Binding Path=BindingContext.ManageFavCommand, Source={x:Reference CurrentView}}"
CommandParameter="{Binding .}"
WidthRequest="75"
VerticalOptions="Fill"/>
</StackLayout>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
当我像这样使用 ViewModel 操作视图时:
private async void ClearCollection()
{
SelectedElement = null;
}
这是工作。
但是当我尝试 select 我的智能手机上的某些行时,我从未传递 SelectedElement 的 setter。
我正在使用 Xamarin.Forms 5.0.0.2196
谢谢你的帮助。
需要进行两项更改:
绑定的类型 属性 (SelectedElement
) 必须匹配 CollectionView 的类型 属性 (SelectedItems
)。
XF Doc 表示类型是 IList<object>
.
您的绑定 属性(如果类型正确)将在解析绑定时(页面加载;BindingContext 设置)设置到 SelectedItems 列表。它开始时是一个空列表。随着选择的改变,列表的内容也会改变。 但是列表对象本身是同一个对象,所以 setter 再也不会被调用。
那么您如何看待变化?通过 SelectionChangedCommand
, or SelectionChanged
event.
使用SelectionChangedCommand
:
添加到 CollectionView XAML:
<CollectionView ... SelectionChangedCommand="{Binding SelectionChangedCommand}" ...>
添加到视图模型(您的 BindingContext):
// There's no point in customizing this setter, because it won't get called when you want it to.
public IList<object> SelectedElement { get; set; }
// in constructor:
SelectionChangedCommand = new Command(SelectionChanged);
public Command SelectionChangedCommand { get; set; }
private void SelectionChanged(object obj)
{
if (SelectedElement != null && SelectedElement.Count > 0) {
var element = SelectedElement[0] as Element;
...
}
}
在你的帮助下我找到了我的问题。
我不需要使用 SelectionChangedCommand(他工作但我不需要这个事件,我只需要数据)
但是为了尝试你的回答,我添加了这个:
SelectionChangedCommandParameter="{Binding .}
现在我的 IList SelectedElement 在我的视图中选择了数据!
谢谢你的帮助。
我试图在我的视图和我的 ViewModel 之间绑定我的 CollectionView 的“SelectedItems”属性。但是 TwoWay 没有用。
我可以将信息发送到我的视图,但我无法将信息发送到我的视图模型。
(所有其他出价均正常工作)
一些代码,在我的 ViewModel 中:
private ObservableCollection<Element> _selectedElement;
public ObservableCollection<Element> SelectedElement
{
get
{
return _selectedElement;
}
set
{
if (_selectedElement != value)
{
_selectedElement = value;
}
}
}
在我看来
<CollectionView ItemsSource="{Binding Elements,Mode=TwoWay}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedElement, Mode=TwoWay}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal" >
<StackLayout Padding="15,10" Orientation="Horizontal" >
<Label Text="{Binding Libelle}" VerticalOptions="Center" />
<Label Text="{Binding Code}" VerticalOptions="Center" />
</StackLayout>
<StackLayout HorizontalOptions="EndAndExpand" VerticalOptions="Center" >
<ImageButton Source="{Binding ImgFavori}"
BackgroundColor="Transparent"
Command="{Binding Path=BindingContext.ManageFavCommand, Source={x:Reference CurrentView}}"
CommandParameter="{Binding .}"
WidthRequest="75"
VerticalOptions="Fill"/>
</StackLayout>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
当我像这样使用 ViewModel 操作视图时:
private async void ClearCollection()
{
SelectedElement = null;
}
这是工作。
但是当我尝试 select 我的智能手机上的某些行时,我从未传递 SelectedElement 的 setter。
我正在使用 Xamarin.Forms 5.0.0.2196
谢谢你的帮助。
需要进行两项更改:
绑定的类型 属性 (
SelectedElement
) 必须匹配 CollectionView 的类型 属性 (SelectedItems
)。 XF Doc 表示类型是IList<object>
.您的绑定 属性(如果类型正确)将在解析绑定时(页面加载;BindingContext 设置)设置到 SelectedItems 列表。它开始时是一个空列表。随着选择的改变,列表的内容也会改变。 但是列表对象本身是同一个对象,所以 setter 再也不会被调用。
那么您如何看待变化?通过 SelectionChangedCommand
, or SelectionChanged
event.
使用SelectionChangedCommand
:
添加到 CollectionView XAML:
<CollectionView ... SelectionChangedCommand="{Binding SelectionChangedCommand}" ...>
添加到视图模型(您的 BindingContext):
// There's no point in customizing this setter, because it won't get called when you want it to.
public IList<object> SelectedElement { get; set; }
// in constructor:
SelectionChangedCommand = new Command(SelectionChanged);
public Command SelectionChangedCommand { get; set; }
private void SelectionChanged(object obj)
{
if (SelectedElement != null && SelectedElement.Count > 0) {
var element = SelectedElement[0] as Element;
...
}
}
在你的帮助下我找到了我的问题。
我不需要使用 SelectionChangedCommand(他工作但我不需要这个事件,我只需要数据)
但是为了尝试你的回答,我添加了这个:
SelectionChangedCommandParameter="{Binding .}
现在我的 IList SelectedElement 在我的视图中选择了数据!
谢谢你的帮助。