zoukankan      html  css  js  c++  java
  • 有的时候,需要利用UserControl占位模板,动态替换的情况,绑定后无法获取DataContext的问题

    有的时候,需要利用UserControl占位模板,动态替换的情况,绑定后无法获取DataContext的问题,特此备注下

    效果如下:

    关键的地方是,下面第3行,需要把当前的上下文传递到Content,生成绑定的ContentTemplate才能获取到绑定在UserControl的DataContext

    1 <Style TargetType="UserControl">
    2             <Setter Property="ContentTemplate" Value="{StaticResource SingleDataTemplate}" />
    3             <Setter Property="Content" Value="{Binding}" />
    4             <Style.Triggers>
    5                 <DataTrigger Binding="{Binding ElementName=rabtn,Path=IsChecked}" Value="false">
    6                     <Setter Property="ContentTemplate" Value="{StaticResource MultipleTemplate}" />
    7                 </DataTrigger>
    8             </Style.Triggers>
    9         </Style>

    下面是完成的前后端代码:

     1 <Window x:Class="VideoAndAudioDemo.MainWindow"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6         xmlns:local="clr-namespace:VideoAndAudioDemo"
     7         mc:Ignorable="d"
     8         Title="MainWindow" Height="450" Width="800">
     9     <Window.Resources>
    10         <DataTemplate x:Key="SingleDataTemplate">
    11             <RadioButton Content="{Binding Name}" />
    12         </DataTemplate>
    13         <DataTemplate x:Key="MultipleTemplate">
    14             <CheckBox Content="{Binding Name}" />
    15         </DataTemplate>
    16         <Style TargetType="UserControl">
    17             <Setter Property="ContentTemplate" Value="{StaticResource SingleDataTemplate}" />
    18             <Setter Property="Content" Value="{Binding}" />
    19             <Style.Triggers>
    20                 <DataTrigger Binding="{Binding ElementName=rabtn,Path=IsChecked}" Value="false">
    21                     <Setter Property="ContentTemplate" Value="{StaticResource MultipleTemplate}" />
    22                 </DataTrigger>
    23             </Style.Triggers>
    24         </Style>
    25     </Window.Resources>
    26     <Grid>
    27         <StackPanel>
    28             <StackPanel Orientation="Horizontal">
    29                 <TextBlock Text="我是模板:" />
    30                 <UserControl/>
    31             </StackPanel>
    32             <StackPanel Orientation="Horizontal" Margin="0 20 0 0">
    33                 <RadioButton x:Name="rabtn" IsChecked="True" GroupName="selected" Content="单选" />
    34                 <RadioButton GroupName="selected" Content="多选" />
    35             </StackPanel>
    36         </StackPanel>
    37     </Grid>
    38 </Window>
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Linq;
     5 using System.Media;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 using System.Windows;
     9 using System.Windows.Controls;
    10 using System.Windows.Data;
    11 using System.Windows.Documents;
    12 using System.Windows.Input;
    13 using System.Windows.Media;
    14 using System.Windows.Media.Imaging;
    15 using System.Windows.Navigation;
    16 using System.Windows.Shapes;
    17 
    18 namespace VideoAndAudioDemo
    19 {
    20     /// <summary>
    21     /// MainWindow.xaml 的交互逻辑
    22     /// </summary>
    23     public partial class MainWindow : Window
    24     {
    25         public MainWindow()
    26         {
    27             InitializeComponent();
    28             var vm = new MainWindowViewModel();
    29             DataContext = vm;
    30 
    31             vm.Name = "测试";
    32         }
    33     }
    34 
    35     public class MainWindowViewModel : INotifyPropertyChanged
    36     {
    37         public event PropertyChangedEventHandler PropertyChanged;
    38         private string name;
    39 
    40         public string Name
    41         {
    42             get => name;
    43             set
    44             {
    45                 name = value;
    46                 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
    47             }
    48         }
    49     }
    50 }
    View Code
  • 相关阅读:
    .NET实现Excel文件的读写 未测试
    权限管理设计
    struts1中配置应用
    POJ 2139 Six Degrees of Cowvin Bacon(floyd)
    POJ 1751 Highways
    POJ 1698 Alice's Chance
    POJ 1018 Communication System
    POJ 1050 To the Max
    POJ 1002 4873279
    POJ 3084 Panic Room
  • 原文地址:https://www.cnblogs.com/xuling-297769461/p/12720131.html
Copyright © 2011-2022 走看看