1. 程式人生 > >SilverLight 5 資料繫結的高階話題(2)

SilverLight 5 資料繫結的高階話題(2)

繫結到索引屬性

除了繫結到巢狀屬性以外,也可以繫結到索引屬性,即可以是整數索引也可是字串索引。索引選擇語法與C#類似-簡單地在集合屬性名後附加一個方括號作為索引號。例如,Person物件有一個Address屬性返回了一個Address物件集合,就可以用如下程式碼繫結到第一個Address物件:

 <TextBox DataContext=”{StaticResource personResource}”          Text=”{Binding Address[0].AddressLine1}” />

如果集合具有字串式索引,如Dictionary<string,string>

,可以採用字串式索引引用語法,如下:

 <TextBox DataContext=”{StaticResource personResource}”             Text=”{Binding Address[HOME].AddressLine1}” />

在上例中,HOMEAddress物件返回的一個字串索引。如果給定的索引未發現,繫結就會失敗,在VS的輸出視窗就會出現一個錯誤提示。

繫結到動態屬性

有時,需要繫結到設計時並不明確結構的資料上,如XMLJSON資料。這種情況下,應該建立一個執行時物件,然後反序列化資料並進行繫結。SilverLight4添加了對動態型別的支援,解決了這一問題。但是,

the downside to creating dynamic objects is that you can’t

actually bind to them,因為SilverLight的繫結引擎並不能識別動態屬性為真正的屬性。任何直接針對動態屬性繫結的嘗試都會失敗。為了克服這一難題,SIlverLight5引入了ICustomTypeProvider介面,可以在類中實現以告知繫結引擎物件的結構。

ICustomTypeProvider介面位於System.Reflection名稱空間,只需要實現一個方法:GetCustomType。但是,這一方法的實現過程非常複雜,需要你從頭建立一個型別。

Type類在SilverLight5是非封閉類,可以從這個類繼承並覆寫其屬性和方法。

Alexandra RusinaSilverLight團隊的專案經理建立了一個Helper類避免了自已實現ICustomTypeProvider介面的複雜性,你可以從以下網址下載這個類:http://blogs.msdn.com/b/silverlight_sdk/archive/2011/04/26/binding-to-dynamic-properties-with-icustomtypeprovider-silverlight-5-beta.aspx. 

使用這個helper類,就可以建立一個即繼承於此類又實現ICustomTypeProvider介面的類,或者建立委託GetCustomType方法到helper類中。後一個方法用於目標類已經繼承於其他類的情況。

下面舉例說明,如何建立一個Products類並在執行時定義其結構:

1、 從建立類開始,並繼承自範型CutomTypeHelper類:

public class Product : CustomTypeHelper<Product> { }

2、 通過呼叫靜態的AddProperty方法(繼承自CustomTypeHelper<T>類)新增屬性到類中,為每個屬性提供一個命名和型別:

Product.AddProperty("ProductName"typeof(string));
Product.AddProperty("Category"typeof(string));
Product.AddProperty("QtyAvailable"typeof(int));

3、 在例項化類的時候,很顯然不能像以往在設計時定義類的方式一樣進行值的設定。而是應該呼叫SetPropertyValue方法(也是繼承自CustomTypeHelper<T>類),傳遞屬性名作為引數併為其賦值:

Product product = new Product();
product.SetPropertyValue("ProductName""Helmet");
product.SetPropertyValue("Category""Accessories");
product.SetPropertyValue("QtyAvailable"10);

4、 現在就可以使用與在標準CLR物件中相同的方法繫結到這一物件及其屬性了。幸虧有helper類,屬性自動實現 INotifyPropertyChanged介面,因此不必擔心這一問題。必要的話,也可以呼叫 GetPropertyValue方法獲取值:

string productName = (string)product.GetPropertyValue("ProductName");
string category = (string)product.GetPropertyValue("Category");
int qtyAvailable = (int)product.GetPropertyValue("QtyAvailable");
 

注:Matt Duffield也提供了實現 ICustomTypeProver介面的實現方法,見:http://mattduffield.wordpress.com/2011/09/16/using-icustomtypeprovider-in-

silverlight-5-with-xml.

增強的資料繫結

Binding類有很多屬性可用於進一步配置資料繫結,而不僅僅是將目標屬性的值與源屬性直接相連線。這些屬性是使得SilverLight資料繫結功能更加強大和靈活的關鍵所在,我們來看看:

字串格式

Bindings有一個StringFormat屬性可以用於在資料傳遞到目標控制元件之前格式化被繫結屬性的值。這是一個很有用的功能,特別是繫結到非字串屬性時,如DateTimeDecimal型別。可以使用StringFormat屬性來設定格式 ,使用與在程式碼中ToString方法相同的格式化字串值的方法,即可以使用標準格式也可以定製格式。比如,如下繫結使用標準格式顯示被繫結屬性的值在TextBox中,將檔案格式為現金格式:

<TextBox Text=”{Binding TotalCost,Mode=TwoWay,stringFormat=C}” />

或者你可以將日期格式化為長日期格式 (如Sunday,May 16,2011:

<TextBox Text="{Binding StartDate, Mode=TwoWay, StringFomat=D}” />

或者使用定製的格式(如2011-05-16):

<TextBox Text="{Binding StartDate, Mode=TwoWay, StringFormat=yyyy-MM-dd}"/>

也可以格式化decimal,singl,doublefloat為一種給定小數位數的格式(如3.14):

<TextBox Text="{Binding PI, Mode=TwoWay, StringFormat=0.00}"/>

如果想要在字串中包含 一些特殊字元,將格式化字串包含在單引號內(不能用引號,因為引號表示屬性值):

<TextBox Text="{Binding StartDate, Mode=TwoWay, StringFormat='MMM dd, yyyy'}"/>

另外,也可以在指定字串前使用反斜線:

Alternatively, you can simply escape them by inserting a backslash (\) prior to the special character:

<TextBox Text="{Binding StartDate, Mode=TwoWay, StringFormat=MMM dd\, yyyy}"/>

注:可用的格式化字串的標準和定製符號的說明詳見MSDNhttp://msdn.microsoft.com/ en-us/library/26etazsy.aspx.其他資源示例也可以在VS2010 data binding expression builder中找到。

另一個整潔的資料繫結技巧是使用繫結的StringFormat屬性連線繫結值與其他文字。比如,你可能想要在一個值前顯示一個標籤。假定你繫結到了一個屬性,返回“Chris Anderson”作為其值,想要在檢視中進行如下的顯示:

Name: Chris Anderson

你就可以使用StackPanel控制元件將兩個TextBlock控制元件放在一 起獲得此效果:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Name: "/>
    <TextBlock Text="{Binding Name}"/>
</StackPanel>

或者使用TextBlock控制元件的Inlines屬性:

<TextBlock>
    <TextBlock.Inlines>
        <Run Text="Name: "/>
        <Run Text="{Binding Name}"/>
    </TextBlock.Inlines>
</TextBlock>

甚至可以建立一個Value轉換器或定製的標記擴充套件來實現。但是,最簡單和優雅的方法是使用Binding物件的StringFormat屬性套用字串佔位符來實現 ,與String類中的StringFormat屬性的語法一樣:

<TextBlock Text="{Binding Name, StringFormat='Name: {0}'}"/>

{0}佔位符取代了被繫結的值,從而有效地實現了兩個字串的連線。

下面是另一個例子,在這裡被繫結值將會包含在兩個括號中間(也就是說TextBlock控制元件會顯示"(Chris Anderson)");

<TextBlock Text="{Binding Name, StringFormat='({0})'}"/>

當然,你只有一個可供替換的值,因為繫結只返回一個值,但是如果你願意,這是一個非常乾淨的方法將被繫結的值與其他值相連線,而無需要一些複雜的實現過程。

當源屬性值為空時的可選值

如果一個屬性被繫結到一個空值,可以獲得一個可替代的值,方法是通過bindingTargetNullValue屬性。這很有用,特別是想要為未提供的資料提供預設值時:

<TextBlock Text=”{Binding TotalAmount ,TargetNullValue=0}” /> 

回撥值

如果繫結的源為空,就意味著控制元件的DataContex屬性和bindingSource屬性都為空,或者說被繫結的屬性在物件中並不存在,你可以使用FallbackValue屬性指定一個替代值。比如,如下的繫結將顯示“Oops!”:

<TextBox Text="{Binding Name, Mode=TwoWay, FallbackValue=Oops!}"/> 

UpdateSourceTrigger

Binding物件的UpdateSourceTrigger屬性可以在雙向繫結模式下指定源屬性何時更新以響應目標屬性的變化。通常在對TextBox控制元件的Text屬性進行繫結時,UpdateSourceTrigger屬性允許指定是在TextBox控制元件失去焦點時控制元件進行更新,還是選擇檔案一旦發生變化立即更新,或是隻有當程式碼顯示指定時更新。現在我們逐個來看看:

預設模式

UpdateSourceTrigger屬性設定為Default,源屬性將在TextBox控制元件失去焦點進行更新,比方說使用者使用Tab鍵切換。由於是預設模式,無需在XAML檔案中顯示指定。當然為了完整,也可以像如下進行設定:

<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Default}"/> 

PropertyChanged模式

SilverLight5現在支援新的UpdateSourceTrigger模式:PropertyChanged模式。這種模式使得被繫結(源)屬性在控制元件屬性變更時立即進行變更;

<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

正如在第6章已經看到的,這種模式特別適用於實現文字框篩選查詢功能,可以根據使用者輸入的文字內容即時過濾資料,從而建立良好的使用者體驗。

 
顯示模式

7章,已經討論過實現IEditableObject介面以新增transaction行為到類中(begin,acceptcancel changes)。藉助IEditableObject介面支援的行為,可以在屬性變更的各個階段設定邏輯,可以選擇顯示聲明後再進行更新操作,比如使用者點選OK按鈕等。這就需要設定Binding物件 UpdateSourceTrigger屬性為Explicit

<TextBox Name="NameTextBox"  Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/> 

注意我們設定的是TextBox控制元件的Name屬性。這一屬性在後置程式碼進行呼叫時將發揮作用。

如果現在就執行程式,你會發現源屬性永遠不會更新。要讓繫結的源屬性發生更新,必須在程式碼中手工進行更新的初始化。假如在檢視中有一個OK按鈕,當按鈕點選後需要將欄位的變更更新到被繫結的物件上。為達此目的,需要在後置程式碼中處理按鈕的Click事件,並使用文字框的Text屬性(使用GetBindingExpression方法,返回BindingExpression物件)。你可以通過呼叫BindingExpression物件的UpdateSource方法顯示地強制繫結的源屬性更新,如下所示:

BindingExpression expr = NameTextBox.GetBindingExpression(TextBox.TextProperty);
expr.UpdateSource();

數值轉換

你已經看到了如何使用BindingStringFormat屬性格式化被繫結的數值,這種格式化是在傳遞到目標控制元件之前進行的,如果想要將數值轉化為完全不同的數值該怎麼辦呢?一個例子是嘗試繫結Boolean值到控制元件的Visibility屬性。正常情況下這是不行的,因為Visibility屬性只接受Visibility列舉值(VisibleCollapsed)。可以修改需要繫結物件的屬性以便返回一個Visibility列舉值,但這並非總是可行的,也並不理想。有一種方法可以在繫結過程中將Boolean值轉化為Visibility列舉值,這種方法就是value converter(下稱值轉換器),值轉換器需要實現IValueConverter介面,共有兩個方法:

Convert方法傳遞繫結源物件的屬性值(作為引數),你可以實現必須的邏輯將該值轉換為可供分配到目標屬性的值(作為方法的返回結果)。

ConvertibleBack方法用於雙向繫結以轉換UI上修改的目標值(作為引數),返回一個可以分配給被繫結屬性(源屬性)的值;

建立一個簡單的值轉換器

下面實現一個簡單的值轉換器:從Boolean值轉換為Visibility列舉值:

複製程式碼 using System;
using System.Windows;
using System.Windows.Data;
 
public class BoolToVisibilityValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        return (bool)value ? Visibility.Visible : Visibility.Collapsed;
    }
 
    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  複製程式碼

注意我們沒有實現 ConvertBack的邏輯,是因為對控制元件Visibility屬性的繫結只有one-timeone-way繫結模式。因此,這一方法不會用到,沒有必要實現它。但是,對其他轉換,有可能會用到此方法,就需要相應的具體實現了。

注:在使用SilverLight業務應用程式專案模板作為應用程式的基礎時,你會發現在專案中已經實現了一些值轉換器(在Helpers資料夾中),例如NotOperationValueConverter值轉換器將ture值轉換為false,而false則轉換為true;

使用值轉換器

一旦建立了值轉換器,就需要在物件的某一層級的資源上例項化它。可以是page,user control的資源,也可以分配到Application物件的資源(在App.xaml檔案裡)從而可以在整個應用程式中使用。首先,宣告一個名稱空間指向值轉換器所在空間:

xmlns:vc="clr-namespace:AdventureWorks.ValueConverters"

然後,例項化值轉換器作為某個物件層級的資源:

<vc:BoolToVisibilityValueConverter x:Key="VisibilityConverter"/>

現在,就可以通過資料繫結的Converter屬性使用值轉換器了,使用StaticResource標記擴充套件獲得對其的引用。如下示例示意瞭如果被繫結物件的IsDirty屬性在物件處於編輯狀態將Save按鈕的Visibility值設定為true(經過值轉換器轉換為Visibility.Visible)

<Button Content="Save" Height="23" Width="75"   Visibility="{Binding IsDirty, Converter={StaticResource VisibilityConverter}}"/> 

向值轉換器傳遞引數

有時需要向值轉換器傳遞附加的引數才能使其正常工作。可以在XAML定義中向值轉換器傳遞引數值,使用BindingConverterParameter屬性;

SIlverLight的早期版本中,值轉換器主要用於格式化被繫結的數值,直到SIlverLight4引入StringForamt屬性才有所改觀,這樣值轉換器在字串轉換上的用途就不是很大了,但是在某些場景仍然是很有用的。與前述討論有所不同的一個場景是在第7章討論過的對RadioButton控制元件的繫結,在此如果想要將RadioButton控制元件繫結到一個列舉型別的被繫結物件上,並且每個RadioButton控制元件分別顯示一個不同的列舉值。正如在第7章討論的一樣,並沒有一個可以直接使用的標準資料繫結模型,如果在繫結中使用值轉換器並傳遞一個引數就使這種場景成為可能。如下的值轉換器展示了一個範型的列舉到布林值的轉換器,通過比較所傳遞數值與所傳遞的引數,如果匹配就返回true,反之返回false.

複製程式碼 using System;
using System.Windows.Data;
public class EnumEqualityValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        return value.ToString() == parameter.ToString();
    }
 
    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        return Enum.Parse(targetType, parameter.ToString(), true);
    }
}
  複製程式碼

注:在上述場景中採用了TwoWay繫結,因此需要能夠將所選定的單選按鈕返回所代表的列舉值,需要為此轉換器實現ConvertBack方法。

這樣我們就可以使用該值轉換器了。假如已經聲明瞭名稱空間並將轉換器例項化為資源,那麼只需要簡單地將值轉換器設定到RadioButton控制元件的Binding物件的Converter屬性,併為每個RadioButton控制元件分配一個列舉值,設定在ConverterParameter屬性上,就可以通過對繫結屬性值和引數值的比較來實現IsChecked是否返回true的操作。

複製程式碼 <RadioButton Content="&lt; 20" IsChecked="{Binding AgeBracket, Mode=TwoWay, 
    Converter={StaticResource EnumConverter}, ConverterParameter=BelowTwenty}
"/>
<RadioButton Content="20 to 29" IsChecked="{Binding AgeBracket, Mode=TwoWay, 
    Converter={StaticResource EnumConverter}, ConverterParameter=Twenties}
"/>
<RadioButton Content="30 to 39" IsChecked="{Binding AgeBracket, Mode=TwoWay, 
    Converter={StaticResource EnumConverter}, ConverterParameter=Thirties}
"/>
<RadioButton Content="40 Plus" IsChecked="{Binding AgeBracket, Mode=TwoWay, 
Converter={StaticResource EnumConverter}, ConverterParameter=FourtyPlus}
"/>
  複製程式碼

傳遞文化屬性到值轉換器

CultureInfo物件也可作為引數傳遞給值轉換器。可用於根據給定的區域與語言型別顯示所需要的資料。

預設情況下,傳遞到值轉換器的區域與語言資訊是從控制元件 Language屬性獲取的,使用的是標準的區域與語言字串,如en-US,表示英語美國)。該值向下覆蓋到全部層級,因此如果在XAML檔案中的根結點指定這一屬性,XAML檔案內的的所有控制元件就都繼承了此值。如果區域與語言未經此屬性顯示指定,預設為美國英語(en-US)(譯者注:預設應為伺服器所使用的區域與語言資訊)。你可以通過Binding物件的ConverterCulture屬性顯示地傳遞區域與語言字串到值轉換器,該字串必須使用culture引數進行傳遞。

傳遞整個物件到值轉換器

如果想要使用源物件的多個屬性轉換為一個單一的輸出,例如將first namesurname屬性組合成單一字串,也可以用值轉換器實現。如下程式碼所示:

複製程式碼 public class FullNameValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {        Person person = value as Person;
        return person.FirstName + "" + person.Surname;
    }
 
    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  複製程式碼

注:這種場景中,最好是新增一個FullName屬性在ViewModel中(指MVVM設計模式)並對其進行繫結。但是,如果沒有實現MVVM設計模式,值轉換器提供了一種可選擇的方案以修改繫結的物件使其適用於UI的需要。

使用屬性元素語法進行繫結

儘管很少使用,事實上也可以使用屬性元素語法進行繫結操作。如下程式碼所示:

<TextBox>
    <TextBox.Text>
        <Binding Path="Name"/>
    </TextBox.Text>
</TextBox>

多繫結

有時,想要繫結控制元件的屬性到源物件的多個屬性,WPF中稱為多繫結,但這一特性在SilverLight中並不可用。前面已經討論了使用值轉換器將多個屬性合併的方法,可以採用這種方法取代多繫結。Colin Eberhardt建立了可以在SilverLight中實現的多繫結方法,可在此獲取:http://www.scottlogic.co.uk/blog/colin/2010/08/silverlight-multibinding-updated-adding-support-for-elementname-and-twoway-binding/.

注:如果使用MVVM設計模式,很少會用到多繫結,因為可以在VidwModel中新增屬性來暴露組合屬性值。

在程式碼中繫結資料

有時,需要在後置程式碼中對控制元件的屬性進行繫結。這可以使用控制元件的GetBindingExpression 和 SetBinding方法實現。

為了建立新的繫結並分配給控制元件的屬性,簡單例項化一個Binding物件(位於System.Windows.Data名稱空間),分配繫結配置到所需要的屬性上,然後使用控制元件的SetBinding方法應用繫結到目標控制元件的屬性上。SetBinding方法需要一個Binding物件和與目標控制元件需要繫結的屬性相連的依賴屬性兩個引數,記住你只能給依賴屬性分配資料繫結值。

例如,需要繫結Product實體的Name屬性到名為NameTextBoxTextBox控制元件的Text屬性:

Binding binding=new Binding(“Name”); 

Binding.Mode=BindingMode.TwoWay;
NameTextBox.SetBinding(TextBox.TextProperty,binding);

在程式碼中建立繫結很簡單,也可以使用binding物件的其他屬性,如StringFormat, TargetNullValue, FallbackValue和 Source等

可以使用控制元件的GetBindingExpression方法來獲取分配給控制元件的繫結屬性:

BindingExpression expr=NameTextBox.GetBindingExpression(TextBox.TextProperty); 

這一方法返回一個BindingExpression物件。BindingExpression類有兩個屬性:ParentBindingDataItem,以及前面提到的UpdateSource方法。ParentBinding屬性提供了分配給控制元件屬性的Binding物件,而DataItem屬性提供了為繫結充當源的物件。

在程式碼中獲取和設定附加屬性

儘管這是一個與資料繫結不同的主題,但是獲取和設定控制元件的附加屬性與獲取和設定繫結物件相類似。使用控制元件的GetValue方法,傳遞給這個方法與附加屬性相關的依賴屬性,就能獲得指定的附加屬性值。比如,使用如下程式碼獲取一個名為NameTextBox的控制元件在Grid控制元件內的行號(Grid.Row附加屬性值):

Int row=(int)NameTextBox.GetValue(Grid.RowProperty);

可以為附加屬性指定新值,使用SetValue方法,該方法需要附加屬性以及新的值作為引數:

NameTextBox.SetValue(Grid.RowProperty,row);

 上述程式碼就可以用於對控制元件在窗體中佈局的動態調整。

相關推薦

SilverLight 5 資料高階話題2

繫結到索引屬性 除了繫結到巢狀屬性以外,也可以繫結到索引屬性,即可以是整數索引也可是字串索引。索引選擇語法與C#類似-簡單地在集合屬性名後附加一個方括號作為索引號。例如,Person物件有一個Address屬性返回了一個Address物件集合,就可以用如下程式碼繫結到第一個

SilverLight 5 資料高階話題1

至此,您已經掌握如何將UI控制元件與物件進行繫結以使使用者可以檢視和編輯這些物件所暴露的資料。資料不是被推進控制元件的,而是通過XMAL提供的繫結將資料拉進控制元件裡。換言之,繫結是控制元件讀取資料的過程。在此前幾章裡已經介紹瞭如下資訊: l 將資料物件分配到控制元件的DataContext屬性; l 有三

單項資料、雙向資料及其原理髒檢查

參考文章: https://segmentfault.com/q/1010000002511449/a-1020000002514653 單向資料繫結:指的是我們先把模板寫好,然後把模板和資料(資料可

Prism 原始碼解讀5-資料和命令

## 介紹 WPF本身就支援通知、繫結和命令,實現ViewModel和VIew之間的通訊,但相對來說功能比較少,Prism擴充了這些功能並提供更加強有力,簡潔的資料繫結和命令。 ## 0 繫結通知 WPF的繫結通知需要實現INotifyPropertyChanged介面,也就是實現一個屬性改變事件,用來

模擬實現WPF的依賴屬性及通知機制3--依賴物件

下面是依賴對像類的實現:(注,這裡涉及到INotifyPropertyChanged介面,大家可以參考MSDN文件瞭解).  /// <summary>     /// 依賴對像,主要提供屬性值和屬性繫結的管理。     /// </summary>

windows下執行緒程序到指定CPU

不知各位程式設計師在測試程式碼效能的時候有沒有注意過,一個程式指定到單獨一個CPU上執行會比不指定CPU執行時快。這中間主要有兩個原因: 1)CPU切換時損耗的效能。 2)Intel的自動降頻技術和windows的機制衝突:windows有一個功能是平衡負載,可以將一個執行緒在不同時間分配到不同CPU,從而

Spring高級話題2

實例化 type cron 獲得 接口 corn 地址 自動掃描 on() 目錄 1、計劃任務@Scheduled 1.1、理論 1.2、示例 2、條件註解@Conditional 2.1、理論 2.1、示例 3、組合註解和元註解 3.1、理論 3.2、示例 所有

此文獻給正打算入門大資料的朋友:大資料學習筆記1000條2

501、MapReduce計算框架中的輸入和輸出的基本資料結構是鍵-值對。 502、Hadoop神奇的一部分在於sort和shuffle過程。 503、Hive驅動計算的“語言”是一XML形式編碼的。 504、Hive通過和Jobtracker通訊來初始化MapReduce任務(Job)。 505、M

資料結構——排序與查詢2——希爾排序C++實現

希爾排序原理 希爾排序(Shell’s Sort),也稱為“縮小增量排序”,是一種插入排序類的演算法。最簡單的插入排序,我在上一個專欄的一篇文章C++抽象程式設計——演算法分析(8)——插入排序演算法與分析有提到過,這裡就不再贅述,這裡就只介紹一些我以前沒寫過的演算法。 希爾排序是一

Python語言資料結構和語言結構2

1. Python預備基礎 變數的命名 變數命名規則主要有以下幾條: 變數名只能包含字母、數字和下劃線,其中下劃線和字母可以開頭,數字不行,即info_1可以,而1_info不行; 變數名內不能包含空格,可以用下劃線替代,即info_1,而非info 1; 不能與Pyt

JAVA高階基礎2---Collection

Collection Collection介面成員方法         boolean add(E e)         boolean remo

資料結構之圖篇2:圖的基本操作 深度和廣度遍歷

程式碼實現 main.cpp(主函式) #include <iostream> #include "CMap.h" using namespace std; /** 圖的的儲存:鄰接矩陣 圖的遍歷:深度+廣度 A / \

.NetCore實踐篇:使用zipkin4net推送資料到分散式監控zipkin2

前言《牧神記》有一句話說的好,破心中神。當不再對分散式,微服務,CLR畏懼迷茫的時候,你就破了心中神。zipkin複習zipkin作用全鏈路追蹤工具(根據依賴關係)檢視每個介面、每個service的執行速度(定位問題發生點或者尋找效能瓶頸)zipkin工作原理創造一些追蹤識別符號(tracingId,span

基礎資料結構與演算法實現2—二叉搜尋樹BST

import java.util.LinkedList; import java.util.Queue; public class BST <E extends Comparable<E>> { private c

資料訪問方式之EntityFramework2

新增控制器 在控制器中例項化資料上下文:private readonly DBContext _db = new DBContext(); 列表return View(_db.Product.T

程式設計與演算法第十週 c++新特性和c++高階主題 2

無序容器(雜湊表) //雜湊表插入和查詢的時間複雜度幾乎是常數 #include <iostream> #include <string> #include <unordered_map> using namespace std; int main

Python高階特性2:Closures、Decorators和functools

裝飾器(Decorators) 裝飾器是這樣一種設計模式:如果一個類希望新增其他類的一些功能,而不希望通過繼承或是直接修改原始碼實現,那麼可以使用裝飾器模式。簡單來說Python中的裝飾器就是指某些函式或其他可呼叫物件,以函式或類作為可選輸入引數,然後返回函式或類

HTML高階標籤2————視窗分幀2————後臺管理頁面

使用frameset進行視窗分幀,構建簡易的後臺頁面。這篇部落格就作為一個簡易後臺管理頁面的實戰演練。 1 首先,需要一個頁面,使用<frameset>按比例劃分為適合的三個區域:頭部,選單,主體。 <frameset>不能放在<body&g

C++高階2——運算子過載及流類庫

引言:                C++倆大難點,一個是指標,一個就是運算子過載及流類庫,你瞭解嗎? 概述:               運算子過載就是對已有的運算子重新進行定義,賦予其另一種功能

【D3.js資料視覺化實戰】--2本地時間軸

背景需求 繪製效果 實現思路 關鍵技術 完整程式碼 背景需求 使用D3繪製圖表一般都會繪製一個座標軸,但是用D3畫過圖的同學都知道預設情況下繪製的座標軸刻度是英文的。但是我們要