2013-10-18 59 views
3

當我將我的集合綁定到以下窗口和usercontrol時,樣式不起作用。WPF資源樣式不顯示第一次

當我按下窗口上的按鈕,樣式一命嗚呼

什麼是從初始綁定射擊停止我的風格?

<Grid> 
    <ItemsControl Name="LbItems" ItemsSource="{Binding MyData}"> 
     <ItemsControl.Resources> 
      <DataTemplate DataType="{x:Type viewModel:SomeViewModel}"> 
       <control:SomeView Margin="5" /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewModel:AnotherViewModel}"> 
       <control:AnotherView Margin="5" /> 
      </DataTemplate> 
     </ItemsControl.Resources> 
    </ItemsControl> 
</Grid> 

而且我有一個用戶控件,如下所示:

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={x:Static 
       RelativeSource.Self}, Path=DataContext.Selected}" Value="False"> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         Red 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding RelativeSource={x:Static 
       RelativeSource.Self}, Path=DataContext.Selected}" Value="True"> 
       <Setter Property="Foreground"> 
        <Setter.Value> 
         DarkSeaGreen 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <Button Command="{Binding SelectCommand}" Content="+" HorizontalAlignment= 
     "Left" VerticalAlignment="Top" Width="25" Grid.Column="0"/> 
    <TextBlock HorizontalAlignment="Left" Margin="5" TextWrapping="Wrap" Text= 
     "{Binding Endorsement.Name}" VerticalAlignment="Top" Grid.Column="1" /> 
    <Button Command="{Binding DeselectCommand}" Content="-" HorizontalAlignment= 
     "Right" VerticalAlignment="Top" Width="25" Grid.Column="2"/> 
</Grid> 
+0

您的'DataTrigger'正在尋找'DataContext'中的一個屬性...您在哪裏設置這個'DataContext'? – Sheridan

+0

用戶控件在網格中顯示正確的數據,所以我認爲數據上下文將在用戶控件上設置,否則不會顯示任何內容。那是不是,對吧?是的,我是一個n00b。 –

+0

你能告訴我們你是如何設定的嗎? – Sheridan

回答

1

頁面加載時,當「選定」被設置爲兩個不同的時間;因此在頁面加載時選擇爲null並且什麼也沒有發生。預計空的情況,如添加樣式

<DataTrigger Binding="{Binding RelativeSource={x:Static 
       RelativeSource.Self}, Path=DataContext.Selected}" Value="{x:Null}"> 
    ... 
+0

謝謝!我不明白爲什麼它是空的,但很酷。 –

+0

@ hiding.ape至於綁定一個更好的方法可能是在後面的代碼中設置頁面的數據上下文。如果有興趣,請查看我的博客文章[Xaml:ViewModel主頁實例化和加載策略以實現更容易的綁定。](http://omegacoder.com/?p=1017)(我在該網站上沒有廣告)。 – OmegaMan

1

你不應該這樣做在你的DataTrigger綁定:

Binding="{Binding RelativeSource={x:Static 
      RelativeSource.Self}, Path=DataContext.Selected}" 

一個默認綁定引用DataContext所以相當簡單的形式是這樣的:

Binding="{Binding Path=Selected}" 

我不認爲這會解決你的問題,但(但如果它確實很棒)。它周圍的一種方法是定義樣式的默認值您的前景如果沒有引發火災:

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Foreground" Value="Red" /> 
     <Style.Triggers> 
     ... 

這是假設所有項目都在負載取消。希望這可以幫助。

乾杯, 埃裏克

+0

也謝謝。這是一個複製/粘貼錯誤。就像我之前說過的,我是一個n00b。所以我現在比編碼器更多的是forager :) –