1

列の1つがコンボボックスであるという点で、Datagridがあります。問題は次のとおりです。コンボボックスがデータグリッドの外側にある場合、SelectedItem は正常に機能しますが、コンボボックスの同じコードがグリッド内にある場合は機能しません。これがコードです。

<StackPanel x:Name="stackPanel" Grid.Row="2" Background="White" Width="{Binding Width, ElementName=lvwPPVEvents}" Margin="0,0,0,1.875" >
        <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}, Path=DataContext.TestNumberofInstallments}" 
                  SelectedItem="{Binding Path=DataContext.TestInstall, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
        <DataGrid ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" 
               ItemsSource="{Binding FilteredOrderedEvents,UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated=True}"
              SelectedItem="{Binding EventSelected}" CanUserReorderColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" 
              CellStyle="{StaticResource ClearlstItmContainerStyle}" AlternatingRowBackground="LightGray" MaxHeight="125"
              AlternationCount="2" SelectionMode="Single" Background="White"  AutoGenerateColumns="False" Margin="0,2"
                  HorizontalGridLinesBrush="White" Width="{Binding ActualWidth, ElementName=stackPanel}" HorizontalAlignment="Left" HorizontalContentAlignment="Stretch">
            <DataGrid.Columns>
                <DataGridTextColumn Width="50" Header="Status" Binding="{Binding Path= Status}" IsReadOnly="True"  />
                <DataGridTextColumn Width="60" Header="Order ID" Binding="{Binding Path= EventID}" IsReadOnly="True"/>
                <DataGridTextColumn Width="140" Header="Title" Binding="{Binding Path= Desc}" IsReadOnly="True"/>
                <DataGridTextColumn Width="120" Header="Date / Time" Binding="{Binding Path= StartDate}" IsReadOnly="True"/>
                <DataGridTextColumn Width="60" Header="Channel" Binding="{Binding Path= Channels}" IsReadOnly="True"/>
                <DataGridTextColumn Width="50" Header="Cost" Binding="{Binding Path= Cost,StringFormat=N2}" IsReadOnly="True"/>
                <!--<DataGridComboBoxColumn Header="Install" Width="Auto" ItemsSource="{Binding colNumberofInstallments}"/>-->
                <DataGridTemplateColumn Header="Install">
                    <!--<DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <wpf:IntegerUpDown Value="{Binding NumberOfInstallments}" FormatString="N0" Increment="1" Maximum="{Binding Max}" Minimum="1"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>-->

                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <!--<TextBlock Text="{Binding NumberOfInstallments}"/>-->
                            <ComboBox ItemsSource="{Binding Path=DataContext.TestNumberofInstallments,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}}" 
                                      SelectedItem="{Binding Path=DataContext.TestInstall, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Width="37" Header="Max" Binding="{Binding Path= Max}" IsReadOnly="True"/>
            </DataGrid.Columns >
        </DataGrid>
    </StackPanel>
4

2 に答える 2

0

と見なすことができるさまざまなコントロールがあるため、バインディングをUserControl適切に行っていないと思われますUserControlRelativeSource

UserControlVisualTreeで最も近いものを見つけようとするのではなく、UserControl の完全なクラス名を使用することをお勧めします。

<ComboBox 
    ItemsSource="{Binding DataContext.TestNumberofInstallments, 
        RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}}" 
    SelectedItem="{Binding DataContext.TestInstall, 
        RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}}" />

ElementName簡単なテストを行ったところ、問題なく動作しているように見えましたが、バインディングで使用できないことに驚きました。おそらくChrisDD はElementName、 と関係があるDataGridTemplateColumnために で使用できないことについて正しいVisualTreeですが、 で使用できることは間違いありませんRelativeSourceDataGridTemplateColumn

<StackPanel x:Name="RootPanel">

    <ComboBox ItemsSource="{Binding ElementName=RootPanel, Path=DataContext.Test}"
              SelectedItem="{Binding ElementName=RootPanel, Path=DataContext.SelectedTest}"
              DisplayMemberPath="TestValue"/>

    <DataGrid ItemsSource="{Binding Test}">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=DataContext.Test}"
                                  SelectedItem="{Binding RelativeSource={RelativeSource AncestorType={x:Type StackPanel}}, Path=DataContext.SelectedTest}"
                                  DisplayMemberPath="TestValue"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>

注意すべきことの 1 つは、WPF はオブジェクトを値ではなく参照で比較するため、SelectedItemはメモリ内のアイテムとまったく同じ参照を指す必要があることです。そうしItemsSourceないと、一致と見なされず、選択されません。

例えば、

ItemsSourceProperty = new ObservableCollection<SomeObject>()
{
    new SomeObject(1),
    new SomeObject(2),
    new SomeObject(3)
};

SelectedItemProperty = ItemsSourceProperty.FirstOrDefault(); // Works
SelectedItemProperty = new SomeObject(1); // Won't work
于 2012-08-21T19:21:38.240 に答える
0

主に DataGridTemplateColumn がビジュアル ツリーの一部ではないため、機能しません。したがって、RelativeSource は、そのコンテキストでは実際には何も意味しません。

ただし、単純なハッキングを実行できます。

    <DataGrid.Resources>
    <TextBlock x:Key="TempHack" DataContext="{YOUR ACTUAL BINDING HERE}"/>
   </DataGrid.Resources>

そして、次のように参照できます。

 <DataGridTemplateColumn Header="{Binding Source={StaticResource TempHack}}" />
于 2012-08-21T17:48:41.983 に答える