2010-11-17 27 views
6

這是我最近創建一個簡單的觸發器。我只是想要datagrid的IsMouseOver == true來顯示按鈕。 問題是Setter的TargetName說:屬性'TargetName'不代表'Setter'的有效目標,因爲找不到名爲'ButtonExpand'的元素。確保在任何使用它的Setters,Triggers或Conditions之前聲明目標。 我在做什麼錯?在一個對象上創建一個簡單的wpf觸發器,影響另一個對象

<UserControl.Resources> 
    <Style TargetType="DataGrid"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter TargetName="ButtonExpand" Property="Visibility" Value="Visible" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 
<Grid> 



    <DataGrid Name="MainDataGrid" ItemsSource="{Binding Programs}" IsReadOnly="True" AutoGenerateColumns="false" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
      <DataGridTextColumn Header="Version" Binding="{Binding Version}"/> 
      <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

    <Button Name="ButtonExpand" Height="25" Width="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Visibility="Hidden">+</Button> 
</Grid> 

回答

21

的TargetName不打算爲 樣式的Triggers集合內使用 。樣式沒有 名稱範圍,所以它沒有意義 通過名稱引用元素。 但是一個模板(DataTemplate或 ControlTemplate)確實有一個 名稱範圍。

請參閱this鏈接。

你可以用另一種方式用按鈕的DataTrigger來實現。請注意,您必須在DataTrigger的樣式中設置屬性可視性。

<Grid Name="MainGrid"> 

    <DataGrid ItemsSource="{Binding Programs}" 
       IsReadOnly="True" 
       AutoGenerateColumns="false" > 
     <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     <DataGridTextColumn Header="Version" Binding="{Binding Version}"/> 
     <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

    <Button Name="ButtonExpand" 
      Height="25" 
      Width="25" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Bottom" 
      Content="+"> 
     <Button.Style> 
      <Style TargetType="Button"> 
       <Setter Property="Visibility" Value="Hidden"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=MainGrid, 
                Path=IsMouseOver}" 
           Value="True"> 
         <Setter Property="Visibility" Value="Visible" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 
</Grid> 

另一種方式來做到這將是ButtonExpand的公開程度綁定到DataGrid的一個轉換器的IsMouseOver屬性。

+0

當鼠標懸停在按鈕上時,它會閃爍。 – Bluebaron 2010-11-17 21:25:45

+0

這是最正確的。我無法給你答案道具,因爲我沒有15級或什麼東西。我在下面發佈了我的答案,但我無法點擊它作爲2天的答案。非常感謝。你絕對應該得到這個答案,但我不想讓任何人遇到同樣的問題。 – Bluebaron 2010-11-17 21:30:39

+1

@Bluebaron:我將你的兩個修改編輯成Meleak的答案,現在你可以刪除你的答案並且標記他的答案是正確的。這兩個更改是Collapsed - > Hidden,MainDataGrid - > MainGrid,並添加周圍的代碼以顯示MainGrid的定義。 – 2010-11-17 22:39:10

0
<Grid Name="MainGrid"> 

    <DataGrid ItemsSource="{Binding Programs}" IsReadOnly="True" AutoGenerateColumns="false" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
      <DataGridTextColumn Header="Version" Binding="{Binding Version}"/> 
      <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

    <Button Name="ButtonExpand" Margin="0,0,20,20" Height="25" Width="25" HorizontalAlignment="Right" VerticalAlignment="Bottom" Content="+"> 
     <Button.Style> 
      <Style TargetType="Button"> 
       <Setter Property="Visibility" Value="Hidden"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=MainGrid, 
              Path=IsMouseOver}" 
         Value="True"> 
         <Setter Property="Visibility" Value="Visible" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 

</Grid> 
+0

我編輯你的兩個變化Meleak的答案,所以現在你可以刪除這個答案,並標記Meleak的答案是正確的。 – 2010-11-17 22:39:55