0

以下のapp:ucPathSelectionコントロールの可視性バインディングが機能するのはなぜですか...

<UserControl.Resources>
    <loc:VM_ucPathSelect x:Key="PathSelectVM" />
</UserControl.Resources>

...

<Grid Name="SelectionGrid">
  <Grid.DataContext>
     <Binding Source= "{StaticResource PathSelectVM}" />
  </Grid.DataContext>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="288*" />
    <ColumnDefinition Width="1" />
    <ColumnDefinition Width="288*" />
    <ColumnDefinition Width="1" />
    <ColumnDefinition Width="288*" />
    <ColumnDefinition Width="1" />
    <ColumnDefinition Width="288*" />
   </Grid.ColumnDefinitions>
   <GridSplitter Grid.Row="0" Grid.Column="1"
                 BorderThickness="1" BorderBrush="Gray" IsTabStop="False" />
   <GridSplitter Grid.Row="0" Grid.Column="3" 
                 BorderThickness="1" BorderBrush="Gray" IsTabStop="False" />
   <GridSplitter Grid.Row="0" Grid.Column="5" 
                 BorderThickness="1" BorderBrush="Gray" IsTabStop="False" />

   <app:ucPathSelectColumn Grid.Row="0" Grid.Column="0" 
       x:Name="ucPathSelectColumn1"
       Visibility="{Binding Source={StaticResource PathSelectVM}, Path=ColumnVisible1}"                    
       DataContext="{Binding Path=VM1}" />

    <app:ucPathSelectColumn Grid.Row="0" Grid.Column="2"
       x:Name="ucPathSelectColumn2"
       Visibility="{Binding Source={StaticResource PathSelectVM},Path=ColumnVisible2}"             
       DataContext="{Binding Path=VM2}" />

    <app:ucPathSelectColumn Grid.Row="0" Grid.Column="4"
       x:Name="ucPathSelectColumn3"
       Visibility="{Binding Source={StaticResource PathSelectVM},Path=ColumnVisible3}"
       DataContext="{Binding Path=VM3}"  />

     <app:ucPathSelectColumn Grid.Row="0" Grid.Column="6"
       x:Name="ucPathSelectColumn4"
       Visibility="{Binding Source={StaticResource PathSelectVM},Path=ColumnVisible4}"     
       DataContext="{Binding Path=VM4}"  />
</Grid>

... Source属性を削除すると、失敗しますか?

   <app:ucPathSelectColumn Grid.Row="0" Grid.Column="0" 
       x:Name="ucPathSelectColumn1"
       Visibility="{Binding ColumnVisible1}"                    
       DataContext="{Binding Path=VM1}" />

    <app:ucPathSelectColumn Grid.Row="0" Grid.Column="2"
       x:Name="ucPathSelectColumn2"
       Visibility="{Binding Path=ColumnVisible2}"             
       DataContext="{Binding Path=VM2}" />

    <app:ucPathSelectColumn Grid.Row="0" Grid.Column="4"
       x:Name="ucPathSelectColumn3"
       Visibility="{Binding Path=ColumnVisible3}"
       DataContext="{Binding Path=VM3}"  />

     <app:ucPathSelectColumn Grid.Row="0" Grid.Column="6"
       x:Name="ucPathSelectColumn4"
       Visibility="{Binding Path=ColumnVisible4}"     
       DataContext="{Binding Path=VM4}"  />

ソースは冗長に見えますが、ソースがないと失敗します。グリッド要素のDataContextは、このコントロールのVMとして上に設定されています。各app:ucPathSelectColumnのDataContextは、同じVMのプロパティとして提供されます...これは同じ資格なしで機能します。可視性のみが失敗していました(デバッグメッセージ、オブジェクトのプロパティが見つかりませんでした...そして報告されたオブジェクトは目的のVM(PathSelectVM)のタイプでした。

同じVMの1つのプロパティがucPathSelectColumnコントロールのVisibilityにバインドするために使用されており、もう1つのプロパティはucPathSelectColumnコントロールのDataContextです。(編集:いいえ、そうではありません。同じスコープのDataContext割り当てを介してVMセットのタイプを報告しています。以下の答えは正しいです。)

4

1 に答える 1

1
   ...Visibility="{Binding Path=ColumnVisible1}"                    
   DataContext="{Binding Path=VM1}"...

DataContextバインディングを削除して確認します。私の推測では、このバインディングはグリッドのバインディングを非表示にします。

于 2013-03-14T23:37:28.917 に答える