最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF數據綁定時出現(xiàn)StringFormat失效的原因和解決方法

 更新時間:2024年12月10日 11:13:36   作者:小碼編匠  
在數據綁定過程中,我們經常會使用StringFormat對要顯示的數據進行格式化,以便獲得更為直觀的展示效果,但在某些情況下格式化操作并未生效,所以本文介紹了WPF數據綁定時出現(xiàn)StringFormat失效的原因和解決方法,需要的朋友可以參考下

前言

在數據綁定過程中,我們經常會使用StringFormat對要顯示的數據進行格式化,以便獲得更為直觀的展示效果,但在某些情況下格式化操作并未生效,例如 ButtonContent屬性以及ToolTip屬性綁定數據進行StringFormat時是無效的。

首先回顧一下StringFormat的基本用法。

StringFormat的用法

StringFormatBindingBase的屬性,指定如果綁定值顯示為字符串,應如何設置該綁定的格式。

因此,BindingBase 的三個子類:Binding、MultiBinding、PriorityBinding都可以對綁定數據進行格式化。

Binding

Binding 是最常用的綁定方式,使用StringFormat遵循.Net格式字符串標準即可。

例如:

<TextBlock Text="{Binding Price,ElementName=self,StringFormat={}{0:C}}"/>

或者

<TextBlock Text="{Binding TestString,ElementName=self,StringFormat=test:{0}}"/>

其中{0}表示第一個數值,如果 StringFormat 屬性的值是以花括號開頭,前邊需要有一對花括號 {} 進行轉義,也就是第一個例子中的 {}{0:C},否則不需要,如第二個示例一樣。

如果設置 ConverterStringFormat屬性,則首先將轉換器應用于數據值,然后StringFormat 應用該值。

MultiBinding

Binding 綁定時,格式化只能指定一個參數,MultiBinding 綁定時則可指定多個參數。

例如:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0} {1}">
            <Binding Path="FirstName" ElementName="self"/>
            <Binding Path="LastName" ElementName="self"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

這個例子中 MultiBinding 是由多個子 Binding 組成,StringFormat 僅在設置 MultiBinding 時適用,子 Binding 中雖然也可以設置 StringFormat,但是會被忽略。

PriorityBinding

相比于前兩種綁定,PriorityBinding 使用的頻率沒那么高,它的主要作用是按照一定優(yōu)先級順序設置綁定列表, 如果最高優(yōu)先級綁定在處理時成功返回值,則無需處理列表中的其他綁定。

如果計算優(yōu)先級最高的綁定需要很長時間,那么將會使用成功返回值的次高優(yōu)先級,直到優(yōu)先級較高的綁定成功返回值。

PriorityBinding 和其包含的綁定列表中的子 Binding 也都可以設置 StringFormat 屬性。

例如:

<TextBlock
    Width="100"
    HorizontalAlignment="Center"
    Background="Honeydew">
    <TextBlock.Text>
        <PriorityBinding FallbackValue="defaultvalue" StringFormat="haha:{0}">
            <Binding IsAsync="True" Path="SlowestDP" StringFormat="hi:{0}"/>
            <Binding IsAsync="True" Path="SlowerDP" />
            <Binding Path="FastDP" />
        </PriorityBinding>
    </TextBlock.Text>
</TextBlock>

MultiBinding 不同的是,PriorityBinding 的子 Binding中的 StringFormat是會生效的,其規(guī)則是優(yōu)先使用子 Binding 設置的格式,其次才使用PriorityBinding 設置的格式。

Content屬性格式化失效的原因

ButtonContent 屬性可以用字符串賦值并顯示在按鈕上,但是使用 StringFormat 格式化并不會生效。

原本我以為是涉及到類型轉換器,在類型轉換過程中處理掉了,但這只是猜測,通過源碼發(fā)現(xiàn)并不是這樣的。

BindingExpressionBase 中有這樣一段代碼:

internal virtual bool AttachOverride(DependencyObject target, DependencyProperty dp)
{
	_targetElement = new WeakReference(target);
	_targetProperty = dp;
	DataBindEngine currentDataBindEngine = DataBindEngine.CurrentDataBindEngine;
	if (currentDataBindEngine == null || currentDataBindEngine.IsShutDown)
	{
		return false;
	}
	_engine = currentDataBindEngine;
	DetermineEffectiveStringFormat();
	DetermineEffectiveTargetNullValue();
	DetermineEffectiveUpdateBehavior();
	DetermineEffectiveValidatesOnNotifyDataErrors();
	if (dp == TextBox.TextProperty && IsReflective && !IsInBindingExpressionCollection && target is TextBoxBase textBoxBase)
	{
		textBoxBase.PreviewTextInput += OnPreviewTextInput;
	}
	if (TraceData.IsExtendedTraceEnabled(this, TraceDataLevel.Attach))
	{
		TraceData.TraceAndNotifyWithNoParameters(TraceEventType.Warning, TraceData.AttachExpression(TraceData.Identify(this), target.GetType().FullName, dp.Name, AvTrace.GetHashCodeHelper(target)), this);
	}
	return true;
}

其中第11行調用了一個名為 DetermineEffectiveStringFormat 的方法,顧名思義就是檢測有效的 StringFormat。接下來看看里邊的邏輯:

internal void DetermineEffectiveStringFormat()
{
	Type type = TargetProperty.PropertyType;
	if (type != typeof(string))
	{
		return;
	}
	string stringFormat = ParentBindingBase.StringFormat;
	for (BindingExpressionBase parentBindingExpressionBase = ParentBindingExpressionBase; parentBindingExpressionBase != null; parentBindingExpressionBase = parentBindingExpressionBase.ParentBindingExpressionBase)
	{
		if (parentBindingExpressionBase is MultiBindingExpression)
		{
			type = typeof(object);
			break;
		}
		if (stringFormat == null && parentBindingExpressionBase is PriorityBindingExpression)
		{
			stringFormat = parentBindingExpressionBase.ParentBindingBase.StringFormat;
		}
	}
	if (type == typeof(string) && !string.IsNullOrEmpty(stringFormat))
	{
		SetValue(Feature.EffectiveStringFormat, Helper.GetEffectiveStringFormat(stringFormat), null);
	}
}

這段代碼的作用就是檢測有效的 StringFormat,并通過 SetValue 方法保存起來,從第4~7行代碼可以看到,一開始就會檢測目標屬性的類型是不是 String 類型,不是的話直接返回,綁定表達式中的 StringFormat 也就不會保存了。

在后續(xù)的 BindingExpression 類計算綁定表達式值時獲取到 StringFormatnull,也就不會進行格式化了。

Button 的 Content 屬性雖然可以用字符串賦值,但它其實的 Object 類型。因此,在檢測有效的 StringFormat 表達式時直接過濾了。ToolTip也同樣是 Object 類型。

解決方法

對于 Content 這種 Object 類型的屬性綁定字符串并且需要格式化時,可以采用以下三種方式解決:

1、最通用的方法就是自定義 ValueConverter,在 ValueConverter 中對字符串進行格式化;

2、綁定到其他可進行 StringFormat 的屬性上,比如 TextBlockText 屬性進行格式化,ToolTip 綁定到 Text 上;

3、既然是 Object 類型,那也可把 TextBlock 作為 Content的值。

<Button Width="120" Height="30">
    <Button.Content>
        <TextBlock Text="{Binding TestString,ElementName=self,StringFormat=test:{0}}"/>
    </Button.Content>
</Button>

小結

數據綁定時出現(xiàn)StringFormat失效的主要分為兩種情況。一是沒有遵循綁定時StringFormat使用的約束,二是綁定的目標屬性不是 String 類型。

最后

以上就是WPF數據綁定時出現(xiàn)StringFormat失效的原因和解決方法的詳細內容,更多關于WPF StringFormat失效的資料請關注腳本之家其它相關文章!

相關文章

  • gridview的buttonfield獲取該行的索引值(實例講解)

    gridview的buttonfield獲取該行的索引值(實例講解)

    本篇文章主要介紹了gridview的buttonfield獲取該行的索引值(實例講解)需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#?WinForm?RichTextBox文本動態(tài)滾動顯示文本方式

    C#?WinForm?RichTextBox文本動態(tài)滾動顯示文本方式

    這篇文章主要介紹了C#?WinForm?RichTextBox文本動態(tài)滾動顯示文本方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C#?as?和?is?運算符區(qū)別和用法示例解析

    C#?as?和?is?運算符區(qū)別和用法示例解析

    在C#中,as?和?is?關鍵字都用于處理類型轉換的運算符,但它們有不同的用途和行為,本文我們將詳細解釋這兩個運算符的區(qū)別和用法,需要的朋友可以參考下
    2025-01-01
  • c# 使用Task實現(xiàn)非阻塞式的I/O操作

    c# 使用Task實現(xiàn)非阻塞式的I/O操作

    這篇文章主要介紹了c# 使用Task實現(xiàn)非阻塞式的I/O操作,幫助大家更好的理解和學習c# 編程語言,感興趣的朋友可以了解下
    2020-11-11
  • C#關于Textbox滾動顯示最后一行,不閃爍問題

    C#關于Textbox滾動顯示最后一行,不閃爍問題

    這篇文章主要介紹了C#關于Textbox滾動顯示最后一行,不閃爍問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • c# NPOI 如何在指定單元格導入導出圖片

    c# NPOI 如何在指定單元格導入導出圖片

    這篇文章主要介紹了c# NPOI 如何在指定單元格導入導出圖片,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#中的Linq to Xml詳解

    C#中的Linq to Xml詳解

    這篇文章主要介紹了C#中的Linq to Xml詳解,本文給出轉換步驟以及大量實例,講解了生成xml、查詢并修改xml、監(jiān)聽xml事件、處理xml流等內容,需要的朋友可以參考下
    2015-01-01
  • c#訪問this關鍵字和base關鍵字示例

    c#訪問this關鍵字和base關鍵字示例

    this關鍵字引用類的當前實例。靜態(tài)成員方法中不能使用this關鍵字,this關鍵字只能在實例構造函數、實例方法或實例訪問器中使用。base關鍵字用于從派生類中訪問基類的成員。下面學習一下這二個關鍵字的使用方法
    2014-01-01
  • C#基于百度AI實現(xiàn)機器翻譯功能

    C#基于百度AI實現(xiàn)機器翻譯功能

    眾所周知,基于百度ai開發(fā)平臺我們可以實現(xiàn)了人臉識別、文字識別 、語音識別等功能。本文將介紹它的另一個功能,即實現(xiàn)機器翻譯,感興趣的可以了解一下
    2022-01-01
  • C#播放背景音樂的方法小結

    C#播放背景音樂的方法小結

    這篇文章主要介紹了C#播放背景音樂的方法,實例總結了C#播放背景音樂的相關技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04

最新評論

阿坝县| 互助| 宁国市| 平潭县| 红桥区| 腾冲县| 平江县| 齐河县| 铜山县| 师宗县| 敦化市| 山西省| 岑溪市| 永嘉县| 隆安县| 南安市| 垫江县| 平安县| 呼伦贝尔市| 普兰县| 六安市| 东乡县| 家居| 天门市| 承德市| 凤山县| 房山区| 定州市| 五莲县| 喀喇| 濉溪县| 安达市| 辽阳县| 闽清县| 海城市| 盖州市| 高邑县| 大洼县| 科技| 长治市| 富川|