首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin Picker绑定

Xamarin Picker绑定
EN

Stack Overflow用户
提问于 2019-09-13 22:03:15
回答 3查看 1.7K关注 0票数 0

是我错过了什么,还是有更多我没有得到的东西。我正在开发一个移动应用程序,必须使用选择器从数据表中进行选择。首先,我有很多这样的基于键/值的选择器。我有一个内部ID和一个对应的Show值。ID并不总是具有1、2、3个值,例如源自查找表,并且可能具有以下内容

代码语言:javascript
复制
KeyID / ShowValue
27 = Another Thing
55 = Many More
12 = Some Item

像这样简单地检索

代码语言:javascript
复制
select * from LookupTable where Category = 'demo'

下面有一个类,用于通过记录列表绑定选择器

代码语言:javascript
复制
public class CboIntKeyValue
{
    public int KeyID { get; set; } = 0;
    public string ShowValue { get; set; } = "";
}

现在,我试图绑定到的数据记录只有ID列与查找相关联。而不会被xaml埋没,但总的来说,我有我的ViewModel。在这上面,我有一个数据记录的实例,它有ID列。

代码语言:javascript
复制
public class MyViewModel : BindableObject
{
    public MyViewModel()
    {
        // Sample to pre-load list of records from data server of KVP
        PickerChoices = GetDataFromServerForDemo( "select * from LookupTable where Category = 'demo'" );


        ShowThisRecord = new MyDataRec();
        // for grins, I am setting the value that SHOULD be defaulted 
        // in picker.  In this case, ID = 12 = "Some Item" from above
        ShowThisRecord.MyID = 12;   
    }

    // this is the record that has the "ID" column I am trying to bind to
    public MyDataRec ShowThisRecord {get; set;}

    // The picker is bound to this list of possible choices
    public List<CboIntKeyValue> PickerChoices {get; set;}
}

我不能绑定到列表的索引,因为当我期望相应的"ID“作为列表中正确记录的基础时,它会给我0,1,2。

在过去的WPF中,我可以声明屏幕的SHOW值,也可以将绑定值声明为ID列。因此,我的"ShowThisRecord“上的INT属性的绑定将驱动并正确地刷新。

我可以看到SelectedItem的绑定,但这是KVP类的全部内容,它不是MyDataRec的一部分。只有ID是它们之间的公共元素。

有没有人能帮我找到合适的绑定,让它正常工作。

代码语言:javascript
复制
<Picker ItemDisplayBinding="{Binding ShowValue}" 
   SelectedItem="{Binding ???}" />

为了确认我的记录绑定是合法的,我的页面有绑定到MyViewModel的上下文,因为我可以通过添加到页面的示例文本条目正确地看到ID。

代码语言:javascript
复制
<Entry Text="{Binding Path=ShowThisRecord.MyID}"/>

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-02 07:17:58

经过大量工作,我最终编写了自己的独立类和模板样式,以满足我的需求。我在CodeProject上发布了源代码,供任何人使用、审查和评估。

https://www.codeproject.com/Articles/5266341/Xamarin-Picker-with-ID-based-Binding

希望这对其他有类似问题的人有所帮助。同样,我遇到的主要问题是,如果我有一个来自数据源的整型键ID,则选择器不会仅根据给定的ID (int或string)自动刷新。

票数 0
EN

Stack Overflow用户

发布于 2019-09-16 17:50:02

我创建了一个演示来测试你的代码,它的工作properly.The完整的演示是here。我还添加了一个函数来验证所选的项。

如果您想同步获取SelectedItem对象,MyViewModel应该是implement INotifyPropertyChanged,我为SelectedItem创建了一个selectedRecord字段,所以您可以这样做:

代码语言:javascript
复制
  public class MyViewModel :ViewModelBase
{
    public MyViewModel()
    {
        // Sample to pre-load list of records from data server of KVP
        //PickerChoices = GetDataFromServerForDemo("select * from LookupTable where Category = 'demo'");
       PickerChoices = new ObservableCollection<TestModel>() {
            new TestModel{ MyID = 5,ShowValue="test1" }, new TestModel{ MyID = 9,ShowValue="test2" },
            new TestModel{ MyID = 18,ShowValue="test18" }, new TestModel{ MyID = 34,ShowValue="test4" }
        };
       // set the default selected item 
       // foreach (TestModel model in PickerChoices) {
       //     if (model.MyID == 18) {// default value
       //         SelectedRecord = model;
       //         break;
       //     }
       // }


        ShowThisRecord = new TestModel();
        // for grins, I am setting the value that SHOULD be defaulted 
        // in picker.  In this case, ID = 12 = "Some Item" from above
        ShowThisRecord.MyID = 12;
    }

    // this is the record that has the "ID" column I am trying to bind to
    public TestModel ShowThisRecord { get; set; }

    //*****************************************

    TestModel selectedRecord; //selected item object
    public TestModel SelectedRecord
    {
        get { return selectedRecord; }
        set
        {
            if (selectedRecord != value)
            {
                selectedRecord = value;
                OnPropertyChanged();
            }
        }
    }

    //*****************************************

    // The picker is bound to this list of possible choices
    public ObservableCollection<TestModel> PickerChoices { get; set; }
}

ViewModelBase

代码语言:javascript
复制
 public  class ViewModelBase: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

xaml

代码语言:javascript
复制
 <Picker  Title="Select a value" x:Name="mypicker"
    ItemsSource="{Binding Path= PickerChoices}"
    SelectedItem="{Binding SelectedRecord}"         
    ItemDisplayBinding="{Binding MyID}"/>

the xaml.cs

代码语言:javascript
复制
 public partial class MainPage : ContentPage
{

    ObservableCollection<TestModel> items = new ObservableCollection<TestModel>();
    MyViewModel testModel = null;
    public MainPage()
    {
        InitializeComponent();

        testModel = new MyViewModel();
        BindingContext = testModel;

        //This will also work
        //if (testModel!=null && testModel.PickerChoices!=null) {
        //  for (int index=0;index< testModel.PickerChoices.Count;index++ ) {
        //        TestModel temp = testModel.PickerChoices[index];
        //    if (18 == temp.MyID) {
        //            mypicker.SelectedIndex = index;
        //            break;
        //     }
        //   }
        //}

        foreach (TestModel model in testModel.PickerChoices)
        {
            if (model.MyID == 18)
            {// default value
                testModel.SelectedRecord = model;
                break;
            }
        }
    }


    // to show the selected item
    private void Button_Clicked(object sender, EventArgs e)
    {
        if (testModel.SelectedRecord!=null) {
        DisplayAlert("Alert", "selected Item  MyID : " + testModel.SelectedRecord.MyID + "<--> ShowValue: " + testModel.SelectedRecord.ShowValue, "OK");
        }
    }

}

结果是:

票数 1
EN

Stack Overflow用户

发布于 2019-09-13 22:06:06

您需要将ItemsSource属性设置为您的CboIntValue项目列表:

代码语言:javascript
复制
<Picker Title="Select a value"
        ItemsSource="{Binding PickerChoices}"
        ItemDisplayBinding="{Binding ShowValue}" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57925129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档