选取器在ViewCell的ContentView中没有显示值

时间:2017-08-05 16:00:44

标签: c# uwp xamarin.forms

这个问题与Picker not showing value in Xamarin.Forms on Windows Phone and UWP非常相似,但是这个问题有一些不同的方面。此选择作为该问题的答案的解决方法在这种情况下也不起作用。

我有一个ListView,其中包含一个包含ContentView的ItemTemplate。 ContentView包含一个可绑定的选择器。选择选择器时,不显示所选值。这是一个明显的错误,因为(1)您可以调整窗口大小并显示值,(2)此问题仅发生在UWP上... iOS和Android版本都可以。

这是简化的问题。首先是主窗口XAML ......

    <StackLayout Padding="10,40">
        <Label>First List</Label>
        <ListView Margin="20"  x:Name="listView1" ItemsSource="{Binding ItemContexts}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <local:ContentView1 
                                                 QuantityRows="{Binding Source={x:Reference listView1}, Path=BindingContext.QuantityRows}"
                                                 />
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Label>Second List</Label>
        <ListView Margin="20"  x:Name="listView2" ItemsSource="{Binding ItemContexts}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Picker x:Name="quantity" ItemsSource="{Binding Source={x:Reference listView2}, Path=BindingContext.QuantityView}" ItemDisplayBinding="{Binding FullName}" 
                            SelectedItem="{Binding QuantityRow, Converter={StaticResource QuantityValueConverter}}"
                            WidthRequest="200">
                            </Picker>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Label>End</Label>
    </StackLayout>

有两个列表视图。第二个工作正常,第一个解释了问题。

以下是内容视图的XAML ...

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="XamarinFormsBench.ContentView1" x:Name="contextView1">
<ContentView.Content>
    <StackLayout Orientation="Horizontal">
        <Picker x:Name="quantity" ItemsSource="{Binding Source={x:Reference contextView1}, Path=QuantityRows}" ItemDisplayBinding="{Binding Name}" 
                            SelectedItem="{Binding QuantityRow}"
                            WidthRequest="200">
        </Picker>
    </StackLayout>
</ContentView.Content>
</ContentView>

内容视图的代码隐藏......

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ContentView1 : ContentView
{
    public static BindableProperty QuantityRowsProperty = BindableProperty.Create("QuantityRows", typeof(ObservableCollection<QuantityRow>), typeof(SummaryDetailView), null, BindingMode.TwoWay, null);
    public ObservableCollection<QuantityRow> QuantityRows
    {
        get
        {
            return GetValue(QuantityRowsProperty) as ObservableCollection<QuantityRow>;
        }
        set
        {
            SetValue(QuantityRowsProperty, value);
        }
    }
    public ContentView1 ()
    {
        InitializeComponent ();
    }

}
}

最后这里是视图模型......

public class QuantityRow
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel()
    {
        QuantityRows = new ObservableCollection<QuantityRow>();
        QuantityRows.Add(new QuantityRow() { ID = 1, Name = "Length" });
        QuantityRows.Add(new QuantityRow() { ID = 2, Name = "Diameter" });
        QuantityRows.Add(new QuantityRow() { ID = 3, Name = "Temperature" });
        QuantityRows.Add(new QuantityRow() { ID = 4, Name = "Pressure" });
        QuantityRows.Add(new QuantityRow() { ID = 5, Name = "Angle" });
    }
    public ObservableCollection<QuantityRow> QuantityRows { get; set; }
    public event PropertyChangedEventHandler PropertyChanged;
}

}

我正在使用Xamarin Forms 2.3.4.247,这是本文撰写时的最后一个稳定版本。我尝试了可能解决问题的最新预发布版本。这是不可能的,因为它创建了许多其他问题。

当选择器选择的索引发生变化时,我尝试使内容视图的布局无效,但同样,这似乎解决了一个问题,并产生了许多其他问题。

所以看来这将在Xamarin Forms的下一个稳定版本中修复。我现在需要的是一个有效的解决方法,所以我可以使用我所拥有的。

1 个答案:

答案 0 :(得分:1)

我已经测试了您的代码并重现了您的问题。问题是BindingContext的{​​{1}}从未设定过值。而这种设计是不可能的,虽然它可以在ios和andriod中工作。根据您的要求,您可以通过自定义ContentView1实现它。

ViewCell

<强> ViewModel.cs

<ViewCell xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XamarinPickerTest.CustomViewCell">
  <ViewCell.View>
      <StackLayout>
            <Picker x:Name="quantity" ItemsSource="{Binding QuantityRows}" 
                           ItemDisplayBinding="{Binding Name}" 
                            SelectedItem="{Binding SelectedQuantityRow}"
                            WidthRequest="200">
            </Picker>
        </StackLayout>
  </ViewCell.View>
</ViewCell>

<强>用法

public class ViewModel : ViewModelBase
{
    public ViewModel()
    {
        QuantityRows = new ObservableCollection<QuantityRow>();
        QuantityRows.Add(new QuantityRow() { ID = 1, Name = "Length" });
        QuantityRows.Add(new QuantityRow() { ID = 2, Name = "Diameter" });
        QuantityRows.Add(new QuantityRow() { ID = 3, Name = "Temperature" });
        QuantityRows.Add(new QuantityRow() { ID = 4, Name = "Pressure" });
        QuantityRows.Add(new QuantityRow() { ID = 5, Name = "Angle" });
    }
    private ObservableCollection<QuantityRow> quantityRows;
    public ObservableCollection<QuantityRow> QuantityRows
    {
        get
        {
            return quantityRows;
        }
        set
        {
            quantityRows = value;
            OnPropertyChanged();
        }
    }
    private QuantityRow selectedQuantityRow;

    public QuantityRow SelectedQuantityRow
    {
        get { return selectedQuantityRow; }
        set
        {
            if (selectedQuantityRow != value)
            {
                selectedQuantityRow = value;
                OnPropertyChanged();
            }
        }
    }
}
public class QuantityRow : ViewModelBase
{
    public int ID { get; set; }

    public string Name { get; set; }

}

以上解决方案在ios和android中运行良好。

enter image description here