WPF中的Binding 使用DataContext作为Binding的数据源

定义:

        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属性已经设置完毕,但是,界面还是无法刷新。

    命令和事件对界面控件的刷新,可能还是有区别,需要进一步的探讨。
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值