1. 程式人生 > >UWP下用x:Bind雙向繫結ComboBox的SelectedItem

UWP下用x:Bind雙向繫結ComboBox的SelectedItem

Code-Behind

構造ComboBoxItem類

ComboBox一般有兩個內容,一個是值Value,一個是顯示的Text,所有構造一個類,具有這兩個屬性

    public class ComboBoxItem
    {
        public string Value { get; set; }
        public string Text { get; set; }
        public ComboBoxItem(string Value, string Text)
        {
            this.Value = Value;
            this
.Text = Text; } }

MVVM相關

設定兩個屬性 ComboBoxItemsComboBoxSelectedItem,分別存放ComboBox的Items集合和選定項

private ObservableCollection<ComboBoxItem> _ComboBoxItems = new ObservableCollection<ComboBoxItem>();
public ObservableCollection<ComboBoxItem> ComboBoxItems { get { return
_ComboBoxItems; } set { Set(ref _ComboBoxItems, value); } } private ComboBoxItem _ComboBoxSelectedItem = null; public ComboBoxItem ComboBoxSelectedItem { get { return _ComboBoxSelectedItem; } set { Set(ref _ComboBoxSelectedItem, value); } }

這裡需要用到相關的幫助方法,實現屬性通知

public event PropertyChangedEventHandler PropertyChanged;

private
void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null) { if (Equals(storage, value)) { return; } storage = value; OnPropertyChanged(propertyName); } private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

同樣,頁面也要實現INotifyPropertyChanged繼承

 public sealed partial class MainPage : Page, INotifyPropertyChanged

雙向繫結

為了實現雙向繫結,需要配備一個轉換器Converter,因為在XAML中,SelectedItem是個object型別,而程式碼中的SelectedItem是個自定義ComboBoxItem型別,所以要有個轉換,讓介面上的變化傳遞到程式碼上的ComboBoxSelectedItem屬性上,這個轉換器是繼承自IValueConverter介面,實現兩個方法即可,這兩個方法就是告訴頁面和程式碼之間的轉換規則。

public class ComboBoxItemConvert:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return value as ComboBoxItem;
    }
}

至此後臺程式碼部分都結束。

XAML

引入轉換器

因為定義了轉換器,轉換器的類和頁面的類不一樣,要通過頁面資源的方式引入進來

<Page
   ...
    xmlns:local="using:RaspberryPi3bPlatform.Views"
   ...>
    <Page.Resources>
        <local:ComboBoxItemConvert x:Key="ComboBoxItemConvert"/>
    </Page.Resources>

ComboBox

引入轉換器後,使用x:Bind這個UWP提供的繫結方法進行繫結即可

<ComboBox 
   ItemsSource="{x:Bind ComboBoxItems}" 
   SelectedItem="{x:Bind ComboBoxSelectedItem,Mode=TwoWay,Converter={StaticResource ComboBoxItemConvert}}}"
   SelectedValuePath="Value"
   DisplayMemberPath="Text"/>

測試程式碼

可以在後臺程式碼裡面直接設定ComboBoxSelectedItem的值,但要注意,設定的值一定要是在ComboBoxItems中的元素,這樣View才能做對比

public UdpServerPage()
{
  InitializeComponent();
  ComboBoxItems.Add(new ComboBoxItem("Value0", "Text0"));
  ComboBoxItems.Add(new ComboBoxItem("Value1", "Text1"));
  ComboBoxItems.Add(new ComboBoxItem("Value2", "Text2"));
  ComboBoxItems.Add(new ComboBoxItem("Value3", "Text3"));
  ComboBoxItems.Add(new ComboBoxItem("Value4", "Text4"));
  ComboBoxSelectedItem = ComboBoxItems.FirstOrDefault(f => f.Text == "Text1");
}

頁面選定項改動,可以通過下個斷點來檢視

public void Watch()
{
   var item = this.ComboBoxSelectedItem;
   this.ComboBoxSelectedItem = ComboBoxItems.FirstOrDefault(f => f.Text == "Text3");
}

變通方法

寫了Convert感覺程式碼亂亂的,還要新增頁面資源,為了避免這個出現,可以直接用string型別繫結到ComboBox的SelectedValue或SelectedText上,這樣就免了寫Convert這個東西了。

相關推薦

UWPx:Bind雙向ComboBox的SelectedItem

Code-Behind 構造ComboBoxItem類 ComboBox一般有兩個內容,一個是值Value,一個是顯示的Text,所有構造一個類,具有這兩個屬性 public class ComboBoxItem {

記錄jquery實現雙向

首先複習下javascript物件的建立方法,一共有3種,分別是: 1,使用內建物件 例如,var obj= new String("aaa"); 2,使用json 例如,var obj = {}; 3,自定義物件 例如,function obj{this.name="a

給id屬性v-bind動態物件和字串

class和id 動態的繫結一個字串達到自定義名稱的方法::class="'字串'+item.value"  :id="'字串'+item.value" <!DOCTYPE html> <html> <head>   <meta c

【VUE】IView.js拉框資料雙向

寫在前面的    在Iview.js的眾多元件中,drop selection也是使用比較頻繁的元件之一,下面就用最為簡單的方法來實現下拉框中資料的動態繫結。 Select Option

js實現一個數據雙向

該接觸angular,就很好奇他是如何實現的,最近有些時間,就查閱了相關的東西,其實很簡單,並沒有想象中的那麼高大上。 從原理觸發 在JavaScript中給一個物件新增屬性可以像下面這樣 obj.age=20; obj.say=function(){} 還可以通過Object.

angular4中ngModel雙向在限制輸入情況與value值不一致的問題及嘗試的解決方法

近期公司的一個後臺專案在使用angular4進行開發,隨著專案的推進和迭代開發,需要對有的input框的value值進行限制輸入,例如目前專案的一些input框只允許輸入數字和'.' 這兩種形式的內容。就在input標籤的中添加了(keyup)屬性,將相應的ts檔案中編寫的一個正則驗證方法賦值給該屬

富文字編輯器TinyMCE在vue2.x中的使用以及動態(解決雙向後游標跳到最左側問題)

寫在前面 專案重構老管理後臺,使用vue作為前端框架,對於一直使用jsp+jquery開發管理後臺的我還是挺頭疼的… 之後在vue官網學習了一下基礎知識外加向前端同事討教,粗略瞭解了vue的使用,如果文中有錯誤地方請多多包涵。 由於不是專業的前端開發,所以並沒有

使用angularjs1.x構建前臺開發框架(十一)——資料雙向

angularjs中有兩個非常重要的概念,一個就是本章要介紹的資料雙向繫結,另一個則是從後端延伸過來的依賴注入。那麼何為資料雙向繫結呢?顧名思義,即元資料(model)和檢視(view)展示的資料存在繫結關係,當元資料中的資訊發生變化時,檢視中的資料會實時變化,反之亦然。

原生js實現資料雙向

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Demo</title> <sc

jquery實現的簡單資料雙向

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script

js實現類似vue的雙向

<!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">         <

Vue2.x父元件與子元件之間的雙向

最近在研究如何寫一套基於Vue2.x的UI元件給自己用,提升一點BIG,在製作含有input的元件遇到一個問題:不知怎樣才能把子元件中input與呼叫者(父元件)的資料實現雙向繫結,想過使用Vuex,但觀摩了一下其他優秀的UI框架,發現使用Vuex會給其他使用者造成麻煩,於

在Intellij IDEAX-debug調試PHP

lec out com dll PE org 註意 2.6.0 輸入 用Intellij IDEA使用X-debug來調試PHP,主要需要配置的部分有三個地方,分別為php.ini的配置,IDEA的配置和瀏覽器的配置,主要如下: php.ini(wamp修改的是phpFo

雙向原理

雙向繫結原理 <input type="text" oninput="evtInput()" id="input"/> <p id="text"></p> // 1、定義物件vue,其中有個屬性:name let vue = { name:

vue-原始碼剖析-雙向

專案中vue比較多,大概知道實現,最近翻了一下雙向繫結的程式碼,這裡寫一下閱讀後的理解。 專案目錄 拉到vue的程式碼之後,首先來看一下專案目錄,因為本文講的是雙向繫結,所以這裡主要看雙向繫結這塊的程式碼。 入口 從入口開始:src/core/index.js index

vue原始碼學習——資料雙向的Object.defineProperty

情景:vue雙向繫結,這應該是多數講vue優勢脫口而出的名詞,然後你就會接觸到一個方法 Object.defineProperty(a,"b",{}) 這個方法該怎麼用 簡單例子敲一下 var a = {} Object.defineProperty(a,"b

Vue雙向原理實現——觀察者模式

前言 Vue 框架是一種 MVVM 框架,它有一個很大的特點就是資料雙向繫結,在開發過程中我們只需要操作 Model ,而不需要修改 View ,使用起來 VR 因吹斯汀。但是它的實現原理並不複雜,主要是運用了設計模式中的觀察者模式,也可以說是加了鉤子函式。下面用原生 JS 實現一下。

angularjs的雙向原理實現

angularjs的雙向繫結用js程式碼來實現 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>雙向繫結的js實現</title>

關於Polymer的雙向的實現的探究(更新中)

探究polymer雙向繫結和單向繫結的實現 個人測試github:https://github.com/lufei222/PolymerElements 遇到的問題: 1、雙向繫結的探究從哪裡下手?直接原始碼中搜索[[]]和{{}}? 2、基於原始版的polymer.h

vue自定義元件實現v-model雙向

vue中父子元件通訊,都是單項的,直接在子元件中修改prop傳的值vue也會給出一個警告,接下來就用一個小列子一步一步實現了vue自定義的元件實現v-model雙向繫結,父元件值變了子元件也會跟著變,子元件中傳過來的值變了,父元件值也會跟著變化。如有錯誤的地方歡迎評論指出 父級元件