代码之家  ›  专栏  ›  技术社区  ›  Vijay Nirmal

如何在ControlTemplate中绑定ComboBox的项源?

  •  2
  • Vijay Nirmal  · 技术社区  · 7 年前

    情况

    我必须更改 Flyout GridView中的项。所以我在创造 ControlTemplate 在里面 Page.Resources 把它放进去 ContentControl 里面是什么 跳伞

    问题

    我有一个 ComboBox 在里面 控件模板 . 现在我想设置 ItemsSource 属于 组合框 List<string> ( _easingType )在 MainPage

    问题

    如何绑定/设置 项源 属于 组合框 在里面 控件模板 ?

    代码

    我删除了代码中不必要的部分

    XAML

    <Page.Resources>
        <ControlTemplate x:Key="BlurEditFlyout">
            ....
            <ComboBox ItemsSource="{Bind it to the _esaingType}" />
            ....
        <ControlTemplate x:Key="BlurEditFlyout">
    </Page.Resources>
    
    <GridView ItemsSource="{x:Bind _items}">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="local:MethodData">
                <StackPanel>
                    ....
                    <Button Visibility="{x:Bind EditButtonVisibility}">
                        <Button.Flyout>
                            <Flyout>
                                <Flyout.FlyoutPresenterStyle>
                                    <Style TargetType="FlyoutPresenter">
                                        <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
                                        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
                                    </Style>
                                </Flyout.FlyoutPresenterStyle>
                                <ContentControl Template="{x:Bind FlyoutTemplate}"/>
                            </Flyout>
                        </Button.Flyout>
                        <SymbolIcon Symbol="Edit"/>
                    </Button>
                    ....
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
    

    代码隐藏

    public sealed partial class MainPage : Page
    {
    
        ObservableCollection<MethodData> _items = new ObservableCollection<MethodData>();
        List<string> _easingType = new List<string>(Enum.GetNames(typeof(EasingType)).ToArray());
        Dictionary<MethodName, ControlTemplate> _buttonFlyoutDictionary = new Dictionary<MethodName, ControlTemplate>();
    
        public MainPage()
        {
            this.InitializeComponent();
    
            LoadFlyoutResources();
    
            _items.Add(GetMethodData(MethodName.Blur));
        }
    
        private void LoadFlyoutResources()
        {
            _buttonFlyoutDictionary.Add(MethodName.Blur, (ControlTemplate)Resources["BlurEditFlyout"]);
            .....
        }
    
        private MethodData GetMethodData(MethodName methodName)
        {
            _buttonFlyoutDictionary.TryGetValue(methodName, out ControlTemplate flyoutTemplate);
            return new MethodData(methodName, flyoutTemplate);
        }
    }
    
    public class MethodData
    {
        public string Name { get; set; }
        public ControlTemplate FlyoutTemplate { get; set; }
        public Visibility EditButtonVisibility { get; set; }
    
        public MethodData(MethodName name, ControlTemplate flyoutTemplate)
        {
            Name = name.ToString();
            FlyoutTemplate = flyoutTemplate;
            EditButtonVisibility = (name == MethodName.Then) ? Visibility.Collapsed : Visibility.Visible;
        }
    }
    
    public enum MethodName
    {
        Blur,
        ....
    }
    

    完整代码

    AnimationSetSamplePage.zip

    2 回复  |  直到 7 年前
        1
  •  2
  •   Vijay Nirmal    7 年前

    弹出控件中的DataContext实际上是“_items”中的每个项。您需要创建一个DataContext代理来访问页面的DataContext。您可以通过这两个链接中的任何一个来创建代理。

    https://weblogs.asp.net/dwahlin/creating-a-silverlight-datacontext-proxy-to-simplify-data-binding-in-nested-controls

    http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

    其要点是,您需要创建一个代理,可以作为静态资源引用。按照第一个链接,您将执行如下操作:

    public class DataContextProxy : FrameworkElement
    {
        public DataContextProxy()
        {
            this.Loaded += new RoutedEventHandler(DataContextProxy_Loaded);
        }
    
        void DataContextProxy_Loaded(object sender, RoutedEventArgs e)
        {
            Binding binding = new Binding();
            if (!String.IsNullOrEmpty(BindingPropertyName))
            {
                binding.Path = new PropertyPath(BindingPropertyName);
            }
            binding.Source = this.DataContext;
            binding.Mode = BindingMode;
            this.SetBinding(DataContextProxy.DataSourceProperty, binding);             
        }
    
        public Object DataSource
        {
            get { return (Object)GetValue(DataSourceProperty); }
            set { SetValue(DataSourceProperty, value); }
        }
    
        public static readonly DependencyProperty DataSourceProperty =
            DependencyProperty.Register("DataSource", typeof(Object), typeof(DataContextProxy), null);
    
    
        public string BindingPropertyName { get; set; }
    
        public BindingMode BindingMode { get; set; }
    
    }
    

    你应该使用 public 的访问修饰符 _easingType

    public List<string> _easingType = new List<string>(Enum.GetNames(typeof(EasingType)).ToArray());
    

    在mainpage.xaml中

    <Page.Resources>        
        <local:DataContextProxy x:Key="DataContextProxy" />
        <ControlTemplate x:Key="BlurEditFlyout">
            ....
            <ComboBox ItemsSource="{Binding Source={StaticResource DataContextProxy}, Path=DataSource._easingType}" />
            ....
        <ControlTemplate x:Key="BlurEditFlyout">
    </Page.Resources>
    ...
    
        2
  •  0
  •   Sunteen Wu    7 年前

    如何绑定/设置 ItemsSource 控件模板中的组合框?

    我不确定你是否有很深的理由问这个问题,但是直接回答这个问题,我们可以设置字符串列表 _esaingType 作为 DataContext 属性并绑定它。例如:

    XAML

    <Page.Resources>
        <ControlTemplate TargetType="FlyoutPresenter"  x:Key="BlurEditFlyout" >
          ...                   
                    <ComboBox ItemsSource="{Binding}" />
          ...
        </ControlTemplate>
    </Page.Resources>
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">  
        <Button>
            <Button.Flyout>
                <Flyout>
                    <Flyout.FlyoutPresenterStyle>
                        <Style TargetType="FlyoutPresenter">
                            <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
                            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
                            <Setter Property="Template" Value="{StaticResource BlurEditFlyout}">                                
                            </Setter>
                        </Style>
                    </Flyout.FlyoutPresenterStyle>
                    <!--<ContentControl Template="{StaticResource BlurEditFlyout}"/>-->
                </Flyout>
            </Button.Flyout>
            <SymbolIcon Symbol="Edit"/>
        </Button> 
    </Grid>
    

    代码隐藏

    List<string> _easingType = new List<string>();  
    public MainPage()
    {
       this.InitializeComponent();
       _easingType.Add("test2");
       _easingType.Add("test1");
       this.DataContext = _easingType;
    }
    

    Data binding in depth .

    推荐文章