定义:
UI元素树的每一个结点都有DataContext,当Binding只知道自己的path ,而不知道source时,会沿着 UI元素树一路的向树根部找过去,路过节点,比较结点的DataContext是否具有Path所指定的属性,有的话,把对应的节点对象作为自己的source
C# class
XAML
对应的逻辑图:
注: 之所以binding会沿着UI元素树向上找,是因为DataContext是一个 “依赖属性”
依赖属性的很重要的特点就是当你没有为控件的某个依赖属性显示的赋值时,控件会把自己容器的属性值借过来,当成自己的属性,当做自己的属性值(最外层Grid设置了DataContext属性值,会一直的传到最内层的button)
使用场景:
(1)当UI上面多个控件共同使用Binding关注同一个对象时,不妨使用DataContext。
(2)当作为source的对象不能被直接访问时候。 B需要访问A ,A是private访问级别,则需要给A的Context赋值,B才能访问,形象的说,Datacontext就是一个数据的制高点,只要放在上面,所有的元素都可以看到。另外,Datacontext本身就是一个依赖属性,我们可以使用binding把它关联到一个数据源上。
以上是Datacontext的简单介绍
下面是工作中需要的实际问题:
Case1:
ListView的简单应用:
<Window.Resources>
<Style x:Key="ListViewItemStyle" TargetType="{x:Type ListViewItem}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
<DataTemplate x:Key="HandleDT">
<TextBlock Text="{Binding RequirementHandle,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
<DataTemplate x:Key="NameDT">
<TextBlock Text="{Binding RequirementName,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
<DataTemplate x:Key="RowNumberDT">
<TextBlock Text="{Binding RowNumber, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
<DataTemplate x:Key="ErrorDT">
<TextBlock Text="{Binding Error, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</Window.Resources>
Binding的是无源的属性,需要设置listview的datacontext属性来定位。
private void Button_Click(object sender, RoutedEventArgs e)
{
if (FileName == null)
{
MessageBox.Show("Please select SWRT file !", "Error", MessageBoxButton.OKCancel, MessageBoxImage.Error);
}
else
{
parse = new ParseExcel(FileName, focusitem);
parse.SWRTRequirementsInput();
this.DataContext = parse;
}
}
Case2
<Button x:Name="BtnSearch" Background="Blue" Content="Button" HorizontalAlignment="Left" Height="28" Margin="23.4,8.8,0,0" Grid.Row="1" VerticalAlignment="Top" Width="34"
Command="{Binding TreeChangedCommand}" Grid.Column="4" Cursor="Hand" >
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid>
<Image x:Name="Uc_Image" Source="/SystemWeaverPorter;component/Image/SearchImage.ico" Height="18" Width="18"></Image>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="Uc_Image" Property="Height" Value="22"></Setter>
<Setter TargetName="Uc_Image" Property="Width" Value="22"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
上面想通过binding来传命令,已经binding了TreeChangedcommand
public ICommand TreeChangedCommand
{
get
{
return new RelayCommand<object>(TreeChangedCommandX);
}
}
private void TreeChangedCommandX(object obj)
{
string input = obj as string ?? "";
MainWindow main = new MainWindow();
RootEntity TemplateRoot = LoadTestArchitecture(main.Export_TestArchitectureInput.Text);
// main.SelectionTree.ItemsSource = new List<BaseEntity>();
main.ShowTree.ItemsSource = new List<BaseEntity>() { TemplateRoot };
}
控件的itemsource属性已经设置完毕,但是,界面还是无法刷新。
命令和事件对界面控件的刷新,可能还是有区别,需要进一步的探讨。