2012-07-09 55 views
0

我正在使用MVVM light框架。在我的一個頁面上,我有一個列表框,它有一個綁定列表和一個綁定的選定項目。我有一個應該突出顯示該列表框中選定項目的樣式。然而,直到我物理地點擊它纔會突出顯示該項目(當它剛被綁定時,它不會突出顯示該項目)。所選項目的WPF觸發器

XAML:

<UserControl.Resources> 
     <hartvm:ViewLocator x:Key="HartvilleLocator" d:IsDataSource="True" /> 
     <DataTemplate DataType="{x:Type Quotes:QuotePetSummaryItem}"> 
      <Views:QuoteSummaryItem DataContext="{Binding}" /> 
     </DataTemplate> 
     <Style x:Key="ListboxItemStyle" TargetType="{x:Type ListBoxItem}"> 
      <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/> 
      </Style.Resources> 
      <Setter Property="BorderBrush" Value="Red"/> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="False"> 
        <Setter Property="BorderThickness" Value="0"/> 
        <Setter Property="Opacity" Value="40"/> 
       </Trigger> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="BorderThickness" Value="1"/> 
        <Setter Property="Opacity" Value="100"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </UserControl.Resources> 
    <UserControl.DataContext> 
     <Binding Source="{StaticResource HartvilleLocator}" Path="QuoteSummary" /> 
    </UserControl.DataContext> 
    <Border> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <Border BorderBrush="Black" BorderThickness="0"> 
       <TextBlock TextWrapping="Wrap" Text="Quote Summary" Margin="5,0,0,0" FontSize="21.333" Foreground="{DynamicResource ControlHeaderBrush}" FontFamily="Verdana"/> 
      </Border> 
      <ScrollViewer d:LayoutOverrides="Height" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.Row="1" Margin="10,10,5,10"> 
       <telerik:RadBusyIndicator IsBusy="{Binding IsProcessing}"> 
<ListBox ItemsSource="{Binding DefaultList}" SelectedItem="{Binding SelectedDefault}" Background="{x:Null}" ItemContainerStyle="{StaticResource ListboxItemStyle}"> 

        <ListBox.ItemsPanel> 
         <ItemsPanelTemplate> 
           <WrapPanel Orientation="Horizontal" /> 
          </ItemsPanelTemplate> 
        </ListBox.ItemsPanel> 
        </ListBox> 
       </telerik:RadBusyIndicator> 
      </ScrollViewer> 
     </Grid> 
    </Border> 
</UserControl> 

代碼(以編程方式選擇列表框中的項目):

public QuotePetSummaryItem SelectedDefault { get; set; } 

private void SelectDefault() 
     { 
      if (DefaultList== null || DefaultList.First().Pet == null) return; 

      SelectedDefault = DefaultList.First(); 

      MessengerService.Send(SelectionMessage.Create(SelectedDefault.SubDefault)); 
     } 

正在發送的消息並不重要,做另一頁上的一些其他工作。 SelectedDefault屬性是本示例唯一使用的。

有人有一個想法,我需要做些什麼來得到這個工作?

+0

在'SelectedDefault = DefaultList.First();'行放置一個斷點。它受到打擊嗎?請張貼'SelectedDefault'的代碼。 – 2012-07-09 18:39:18

回答

0

它看起來像綁定(並因此您的視圖)不知道所選的項目屬性已更改。

在SelectedDefault的setter中,您需要使用INotifyPropertyChanged接口創建某種類型的通知。

我剛接手一個快速瀏覽一下MVVM光框架和樣本來看,如果你的視圖模型繼承ViewModelBase使用字段支持的屬性並調用RaisePropertyChanged:

 


    private QuotePetSummaryItem _selectedDefault; 
    public QuotePetSummaryItem SelectedDefault 
    { 
     get { return _selectedDefault; } 
     set 
     { 
      _selectedDefault = value; 
      RaisePropertyChanged("SelectedDefault"); 
     } 
    } 

 
0

首先你必須設置爲將selectedItem結合模式,以雙向

<ListBox ItemsSource="{Binding DefaultList}" SelectedItem="{Binding SelectedDefault, Mode=TwoWay}" Background="{x:Null}" ItemContainerStyle="{StaticResource ListboxItemStyle}"> 

2日在您的視圖模型,你必須執行INotifyPropertyChanged,並適當提高了。看看Rock Counters的答案。

如果這一切都不起作用檢查您的輸出窗口的綁定錯誤。