0

MVVM ライト フレームワークを使用しています。私のページの1つに、バインドされたリストとバインドされた選択されたアイテムを持つリストボックスがあります。そのリストボックスで選択したアイテムを強調表示するスタイルがあります。ただし、物理的にクリックするまで項目は強調表示されません (バインドされたばかりの項目は強調表示されません)。

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 プロパティは、この例で使用される唯一のものです。

これを機能させるために私が何をする必要があるかについて、誰かが考えを持っていますか?

4

2 に答える 2

0

バインディング (およびビュー) は、選択された項目のプロパティが変更されたことを認識していないようです。

SelectedDefault のセッターでは、INotifyPropertyChanged インターフェイスを使用して何らかの通知を作成する必要があります。

MVVM ライト フレームワークを簡単に見て、サンプルで判断したところ、ビューモデルが ViewModelBase から継承されている場合は、フィールド バックド プロパティを使用して RaisePropertyChanged を呼び出します。



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


于 2012-07-09T20:59:28.127 に答える
0

まず、選択した項目のバインド モードを双方向に設定する必要があります。

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

ビューモデルの2番目に、INotifyPropertyChangedを実装して適切に上げる必要があります。Rock Countersの回答を見てください。

これらすべてが機能しない場合は、vs 出力ウィンドウでバインディング エラーを確認してください。

于 2012-07-10T06:01:07.297 に答える