3

私は gridView を持っており、ObservableCollection のさまざまなクラス項目をハブ ページにバインドしています。さまざまなクラス アイテムを gridView にバインドし、さまざまなアイテムのデータ テンプレート、ヘッダー テンプレートを表示します。

グリッドビューのヘッダー テンプレートでユーザー コントロールを使用しています。ユーザーコントロールとユーザーコントロールを含む私のヘッダーテンプレートには、いくつかのコンボボックスが含まれています。pageRoot オブジェクトのパラメーターを介して、pageRoot datacontext コレクションを headertemplate コンボボックスにバインドします。

ユーザー コントロールを作成し、いくつかの DependencyProperty、コンボボックス イベント ハンドラを作成しています。しかし、pageRoot DataContext コレクションをユーザー コントロール コンボボックスにバインドすることはできません :(

私の英語は下手です、このような状況で申し訳ありません;) 回答ありがとうございます..

私のヘッダーデータテンプレート:

<DataTemplate x:Key="OrganizationFixtureHeaderTemplate">
    <Grid Margin="6">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0">
            <TextBlock Text="{Binding Title}" Style="{StaticResource TitleTextStyle}"/>
        </StackPanel>

        <UserControls:UcCbOrganizationFixtureSelections  
            Grid.Column="1"
            RootElement="pageRoot"
            PageOrganizationSource="{Binding PageOrganization, ElementName=pageRoot}"
            />

    </Grid>
</DataTemplate>

私のユーザー制御コード:

<UserControl
    x:Class="Modern_UI.Common.UserControls.UcCbOrganizationFixtureSelections"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Modern_UI.Common.UserControls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Orientation="Horizontal">
        <ComboBox x:Name="cbOrgFixtureSeasons" 
                          ItemsSource="{Binding Path=DataContext.Seasons, ElementName=RootElement}"
                          SelectedValuePath="Id" 
                          DisplayMemberPath="Name"
                          SelectionChanged="CbOrgFixtureSeasons_OnSelectionChanged"
                          Width="Auto"
                          Height="Auto"
                         />
        <ComboBox x:Name="cbOrgFixtureStages" 
                          ItemsSource="{Binding Path=DataContext.FixtureStages, ElementName=RootElement}"
                          SelectedValuePath="Id" 
                          DisplayMemberPath="Name"
                          SelectionChanged="CbOrgFixtureStages_OnSelectionChanged"
                          Width="Auto"
                          Height="Auto"
                  />
        <ComboBox x:Name="cbOrgFixtureRounds" 
                     ItemsSource="{Binding Path=DataContext.FixtureRounds, ElementName=RootElement}"
                     SelectedValuePath="Id" 
                     DisplayMemberPath="Name"
                     SelectionChanged="CbOrgFixtureRounds_OnSelectionChanged"
                     Width="Auto"
                     Height="Auto"
                  />
    </StackPanel>
</UserControl>

ユーザー制御の背後にあるコード:

namespace Modern_UI.Common.UserControls
{
    public sealed partial class UcCbOrganizationFixtureSelections : UserControl
    {  
        public DependencyProperty RootElementProperty = DependencyProperty.Register("RootElement",
                                                                                    typeof(string),
                                                                                    typeof(
                                                                                        UcCbOrganizationFixtureSelections
                                                                                        ),
                                                                                    null);


        public DependencyProperty PageOrganizationSourceProperty = DependencyProperty.Register("PageOrganizationSource",
                                                                                               typeof(Organization),
                                                                                               typeof(
                                                                                                   UcCbOrganizationFixtureSelections
                                                                                                   ),
                                                                                               null);

        public string RootElement
        {
            get { return this.GetValue(RootElementProperty) as string; }
            set { this.SetValue(RootElementProperty, value); }
        }

        public Organization PageOrganizationSource
        {
            get { return this.GetValue(PageOrganizationSourceProperty) as Organization; }
            set { this.SetValue(PageOrganizationSourceProperty, value); }
        }


        public UcCbOrganizationFixtureSelections()
        {
            this.InitializeComponent();
        }

        async private void CbOrgFixtureSeasons_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          //loading root page parameter via "PageOrganizationSource" named DependencyProperty.
        }
}
4

1 に答える 1

0

コードの問題を解決し、いくつかのコードを追加しました。

1- ルート ページ DataContext のユーザー コントロールをバインドします。gridviewテンプレート内のユーザーコントロールのため。データ テンプレート内のコントロール内にある場合、データ テンプレート項目ソースの既定のデータ コンテキストをバインドします。アイテムソースのデータコンテキストとは関係なく、ルートページのデータコンテキストをバインドしたい。DataTemplate の置き換えられたコード:

<DataTemplate x:Key="OrganizationFixtureHeaderTemplate">
    <Grid Margin="6">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Column="0">
            <TextBlock Text="{Binding Title}" Style="{StaticResource TitleTextStyle}"/>
        </StackPanel>

        <UserControls:UcCbOrganizationFixtureSelections  
            Grid.Column="1"
            RootElement="pageRoot"
            DataContext="{Binding DataContext, ElementName=pageRoot}"     
            PageOrganizationSource="{Binding PageOrganization, ElementName=pageRoot}"
            />
    </Grid>
</DataTemplate> 

2- ユーザー コントロールの xaml コードを置き換えます。ユーザー コントロールの Datacontext は rootPage DataContext になりました。この状況では、すべてのコレクションをコンボボックスにバインドできます。置き換えられたコード:

<UserControl
    x:Class="Lig_TV_Modern_UI.Common.UserControls.UcCbOrganizationFixtureSelections"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel Orientation="Horizontal">
        <ComboBox x:Name="cbOrgFixtureSeasons" 
                          ItemsSource="{Binding Seasons}"
                          SelectedValuePath="Id" 
                          DisplayMemberPath="Name"
                          SelectionChanged="CbOrgFixtureSeasons_OnSelectionChanged"
                          Width="Auto"
                          Height="Auto"                             
                         />        
    </StackPanel>
</UserControl>

この問題について考えてくれてありがとう。この構造はすべての要素に伝達でき、datatemplate itemsource datacontext なしですべてのコレクションをバインドできます。データ テンプレートを使用し、コントロールのイベント ハンドラーが必要な場合は、ユーザー コントロールを使用できます。

良いコード化された日 ;)

于 2012-12-03T13:37:35.987 に答える