最平常的运用体式格局,他的目的元素是控件上的DataContext对象。以下:
<TextBlock Grid.Column="0" Text="{Binding DishName}" Style="{StaticResource TakingDishDishNameTextStyle}" />
DataContext这个属性是在FrameworkElement类上面的。也就是说大部分的控件上都邑有本身的DataContext的。那末我们平常只需在最外层设置DataContext属性。为了越发清晰的相识DataContext绑定。笔者做了一个简朴的例子。笔者给最表面的Window设置了DataContext值。同时也给他的内部的Grid也设置了DataContext值。然则他们俩个不是同一个对象范例只是属性雷同而以。以下
<Window x:Class="Wpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:aomi="http://aomiwpf.com/ModernUI"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local ="clr-namespace:Wpf"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:WindDataContext /></Window.DataContext><Grid><Grid.DataContext><local:GridDataContext /></Grid.DataContext><TextBlock Text="{Binding TestName}"></TextBlock></Grid></Window>
实行效果:
试验能够证实规范的绑定体式格局的目的元素是DataContext。他会去找当前绑定元素最靠近的DataContext。我们在来一个假定——假如GridDataContext类内里属性TestName换成TestName1的话,又是什么模样呢?以下
1 public class GridDataContext : NotifyPropertyChanged 2 { 3 private string _testName1 ="GridDataContext"; 4 5 public string TestName1 6 { 7 set 8 { 9 10 if (this._testName1 != value)11 {12 this._testName1 = value;13 OnPropertyChanged("TestName1");14 }15 }16 get { return this._testName1; }17 }18 }
实行效果:
不好意义!笔者认为他会去找Window的DataContext的属性TestName。明显他不会。又说清楚明了一点,他只会去靠近的DataContext内里找。不会一个直一个的往上面去找。
值得注重的是假如上面只是写{Binding}的话,那就是把当前的DataContext绑定过来。而不是他的属性。
在开辟过程当中,我们每每愿望某个元素能跟另一个元素上面的属性举行绑定。只需另一个元素属性转变就会关照某个元素一同转变。这个时刻就是不得不必下面的体式格局来了。
{Binding ElementName=SomeThingName, Path=Text}
ElementName:示意元素的称号。
Path:示意元素对象的属性。
事实上我们能够想到一个题目。绑定是否是只能一方影响一方呢。这就是绑定的内里要用到的形式。以下
{Binding ElementName=SomeThindName, Path=Text,Mode=TwoWay}
TwoWay:致使对源属性或目的属性的变动可自动更新对方。
OneWay: 当绑定源(源)变动时,更新绑定目的(目的)属性。
OneTime:当应用程序启动或数据上下文变动时,更新绑定目的。
OneWayToSource:当目的属性变动时更新源属性。
以上的用法算是比较经常使用的。也是比较简朴的。不如让我们看一下开源项目内里的一个绑定表达式吧。以下
<Button Command="{Binding Source={x:Static SystemCommands.MinimizeWindowCommand}}" ToolTip="{x:Static modernui:Resources.Minimize}" Style="{StaticResource SystemButton}"> <Button.Content> <Grid Width="13" Height="12" RenderTransform="1,0,0,1,0,1"> <Path Data="M0,6 L8,6 Z" Width="8" Height="7" VerticalAlignment="Center" HorizontalAlignment="Center" Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}" StrokeThickness="2" /> </Grid> </Button.Content></Button>
不知道人人看得明不明白。上面的意义是从父节点Button的Foreground和当前Path的Stroke绑定在一同。重要的症结在AncestorType。用于指定父亲的范例。Mode是一个RelativeSourceMode范例。他有四个值。以下。
PreviousData: 用于数据列表,意指之前的数据项。等于数据鸠合上面的显现。不包括控件。
TemplatedParent:用于模板上的绑定。
Self:元素本身本身上的属性相绑定。
FindAncestor:用于查找父级元素。
只需这模样一解说就能够明白RelativeSource用于指定相对的源元素。等于目的元素。
事实上,上面的表达式另有一种能够用到的写法。等于多出了一个用于限定父级的深度(AncestorLevel)。以下
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=Name}
注重:假如想对绑定的值举行修正的话,要用转化器。以下
{Binding ElementName=SomeThindName, Path=Text,Mode=TwoWay,Converter=XXXConverter}
在开辟自定义控件的时刻,我们会经经常使用到一个表达式。以下
Width="{TemplateBinding Width}"
上面的写法只是一种缩写。完全的以下
Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}"
能够说上面的内容是笔者最经常使用到的。接下来让我们在去看一些绑定其他的内容点。等于那些不常见的内容。
1.StringFormat的功用。相当于string.format功用一模样。举个列子。假如我们要在金额的前加上“¥”的时刻,能够用一下。以下
<TextBlock Text="{Binding MoneyText, StringFormat=¥{0}}" />
假如不是这模样做的话,你就不得不给“¥”一个TextBlock来显现,或是MoneyText变成string范例,然后设置值内里加上¥。然则笔者这里倒是double范例的。所以用StringFormat的功用有就能够圆满的决解了显现“¥”的题目。
实行效果:
2.TargetNullValue的功用,用于绑定目的是一个null值的时刻,要显现的内容。以下笔者给NullName赋null。
<TextBlock Text="{Binding NullName, TargetNullValue=aomi}" />
实行效果:
3.FallbackValue的功用,用于绑定目的是发作毛病的时刻,要显现的内容。以下
<TextBlock Text="{Binding NullName, FallbackValue=aomi}" />
实行效果笔者就不贴了。
文章末了。在来申明一个不经常使用的功用——PriorityBinding。这个功用笔者不好说。只能让读者们自行体味吧。他重要用于在加载时间比较多的时刻,要显现的信息。比方显现“正在加载中...”。笔者做了例子吧。
Xaml:
<Window x:Class="Wpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:aomi="http://aomiwpf.com/ModernUI"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local ="clr-namespace:Wpf"Title="MainWindow" Height="350" Width="525"><Window.DataContext><local:MainViewModel /></Window.DataContext><Grid><TextBlock><TextBlock.Text><PriorityBinding><Binding Path="UserName" IsAsync="True"></Binding><Binding Path="LoadingName"></Binding></PriorityBinding></TextBlock.Text></TextBlock></Grid></Window>
ViewModel:
public class MainViewModel : NotifyPropertyChanged {private string _userName ="Haya";private string _loadingName = "正在加载中...";public string UserName {set{if (this._userName != value) {this._userName = value; OnPropertyChanged("UserName"); } }get { Thread.Sleep(7000);return this._userName; } }public string LoadingName {set{if (this._loadingName != value) {this._loadingName = value; OnPropertyChanged("LoadingName"); } }get { return this._loadingName; } } }
实行效果:
七秒后:
本章的内容比较简朴。笔者只是报告了经常使用的一些知识点。然则必不是说就这些了。比方Binding还关系到Xml的绑定和鸠合的绑定功用。读者们能够自行去找一下材料。
以上就是浅谈WPF之Binding表达式的细致内容,更多请关注ki4网别的相干文章!