【问题标题】:How to set the SelectedItem when having databound ListPicker?有数据绑定 ListPicker 时如何设置 SelectedItem?
【发布时间】:2014-08-01 06:16:53
【问题描述】:

我在 WindowsPhone 应用中有一个 CartPage。它显示购物车中的项目及其选择的数量。 我使用 ListPicker 来更改数量。现在我有两个问题,

  1. 如何在 ListPicker 中设置默认数量(我从 localstorage 获取产品数量)。
  2. 当我从 ListPicker 中选择数量时,如何将其保存到变量中?

    <Grid.Resources>
    
        <DataTemplate x:Name="PickerFullModeItemTemplate">
            <StackPanel Orientation="Horizontal" Margin="16 21 0 20" >
                <TextBlock Name="TextQuantity" Text="{Binding Quantity}" Margin="16 0 0 0" FontSize="43" FontFamily="{StaticResource PhoneFontFamilyLight}"/>
    
            </StackPanel>
        </DataTemplate>
    </Grid.Resources>
    

<toolkit:ListPicker   toolkit:TiltEffect.IsTiltEnabled="True" Name="QuantityBox" Margin="264,91,142,36" Background="#FFA05E6A" FullModeItemTemplate="{StaticResource PickerFullModeItemTemplate}" BorderBrush="#FF8D7373" Foreground="#FF310836" FontSize="20" SelectionChanged="QuantityBox_SelectionChanged" MouseEnter="QuantityBox_MouseEnter" BorderThickness="1"/>

   public class ListQuantityClass
    {
        public int Quantity { get; set; }

    }

   List<ListQuantityClass> QuantitySource = new List<ListQuantityClass>();

                for (int i = 1; i <= 20; i++)
                {
                    QuantitySource.Add(new ListQuantityClass() { Quantity = i });
                }
                Custom.QuantityBox.ItemsSource = QuantitySource;

以下两行都给我错误:

                   Custom.QuantityBox.SelectedItem = cart.ProductQuantity;
                singletonInstance.QuantityChanged = int.Parse(QuantityBox.SelectedItem.ToString());

实际上它明显的 QuantityBox.SelectedItem 不会工作,因为 ListPicker 是 QuantitySource 列表的 Databdound。用什么来代替 QuantityBox.SelectedItem?

【问题讨论】:

标签: c# windows-phone-8 silverlight-toolkit selecteditem listpicker


【解决方案1】:

由于这是一个由两部分组成的问题,因此我将其分为两个部分。


  • 如何在 ListPicker 中设置默认数量(我正在获取 本地存储的产品数量)。

您只能将 SelectedItem 设置为 ItemSource 中的一个项目。用你的例子,

public partial class MainPage : PhoneApplicationPage
{

    List<ListQuantityClass> QuantitySource = new List<ListQuantityClass>();

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        for (int i = 1; i <= 20; i++)
        {
            QuantitySource.Add(new ListQuantityClass() { Quantity = i });
        }
        my_listpicker.ItemsSource = QuantitySource;

        // setting default value to 3
        my_listpicker.SelectedItem = QuantitySource[2];

        // fancy search and set
        // my_SetSelectedItemBasedOnQuantity(my_listpicker, 4); // this will set it to 4

    }
}

  • 当我从 ListPicker 中选择数量时,如何将其保存到 变量?

这是一个更复杂的问题。您可以遍历 ItemSource 中的 Items 并检查它是否等于 SelectedItem 并以这种方式保存。但如果你使用事件,我更喜欢这样。

    private void my_listpicker_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            var listpicker = sender as ListPicker;
            if (listpicker != null)
            {
                var selected_item = listpicker.SelectedItem as ListQuantityClass;
                int quantity = selected_item.Quantity;

                // TODO: Save the value in quantity to a file or send it to a webservice
            }
        }
        catch (Exception ex)
        {
            string error_message = ex.Message;
        }

    }

XAML

    <Grid.Resources>
        <DataTemplate x:Name="PickerItemTemplate">
            <TextBlock Text="{Binding Quantity}" FontSize="43"/>
        </DataTemplate>

        <DataTemplate x:Name="PickerFullModeItemTemplate">
            <TextBlock Text="{Binding Quantity}" Margin="16 0 0 0" FontSize="43"/>
        </DataTemplate>
    </Grid.Resources>


    <toolkit:ListPicker Header="my list picker demo"  x:Name="my_listpicker" ItemTemplate="{StaticResource PickerItemTemplate}" FullModeItemTemplate="{StaticResource PickerFullModeItemTemplate}" SelectionChanged="my_listpicker_SelectionChanged" MaxHeight="300"/>

根据数量设置 SelectedItem 的函数

    private void my_SetSelectedItemBasedOnQuantity(ListPicker lp, int quantity)
    {
        // first search for quantity if a match is found set it
        try
        {

            foreach (ListQuantityClass lqc in lp.ItemsSource)
            {
                // match found
                if (lqc.Quantity == quantity)
                {
                    lp.SelectedItem = lqc;
                }
            }
        }
        catch (Exception ex)
        {
            string error = ex.Message;
        }
    }

【讨论】:

  • 关于您的 my_listpicker.SelectedItem = QuantitySource[2]; ,我尝试使用:Custom.QuantityBox.SelectedItem = QuantitySource[cart.ProductQuantity];但默认项仍然是“XMLParsing.Cart+ListQuantityClass”
  • 哦,你忘了定义一个 ItemTemplate="{StaticResource PickerItemTemplate}",我会更新解决方案。
  • 非常感谢,它现在在打开页面时显示我的第一个项目。我现在有两个问题: 1:如何从 Cart.ProductQuantity 获取此默认项目? 2:我的 Listpicker 正在以 FULLMODE 模式打开。如何像组合框一样打开它而不是全屏?
  • 我正在使用 &lt;DataTemplate x:Name="PickerItemTemplate"&gt; &lt;TextBlock Text="{Binding QuantityUser}" FontSize="20"/&gt; &lt;/DataTemplate&gt;List&lt;UserQuantityClass&gt; QuantityUserList = new List&lt;UserQuantityClass&gt;(); QuantityUserList.Add(new UserQuantityClass() { QuantityUser = cart.ProductQuantity }); 但它给了我空白。现在没有选定的项目。
  • 非“FULLMODE”是通过给它一个 MaxHeight 来实现的。更新了解决方案。至于另一个问题,您想编写一个搜索函数来搜索 itemsource 中与您的选择匹配的项目。然后将其设置为。
【解决方案2】:

我认为您不能使用SelectedItem 来设置所选项目。您应该设置SelectedIndex 属性。 SelectedItem 用于获取选中项。虽然文档说它可以用于设置选中项,但我从未见过任何实际实现。

【讨论】:

  • 你能看一下这个截图吗,我已经标记了我的ListPicker。观察它显示的内容:如何在其中获取 cart.ProductQuantity 而不是 XML_PARSING。 s30.postimg.org/odk6tr4g1/Screenshot_24.png
  • 请说明您是如何设置 cart.ProductQuantity
  • cart.ProductQuantity 来自数据库,并且运行良好。我在单独的文本框中对其进行了测试。
  • 我试过了:Custom.QuantityBox.SelectedItem = new ListQuantityClass() { Quantity = cart.ProductQuantity };但是 ListPicker 中的默认项仍然没有出现。
  • @AtìfShabër:所以你的意思是购物车是 ListQuantityClass 类型的对象?你的仍然不是正确的做事方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多