質問

私はThreadSafeObservableCollectionにバインドされたListViewを持っています。これらの各項目の背景が色変換を介して実行される列挙に設定され、ここでこれらの2つの設定のためのコードです。

<UserControl.Resources>
    <EncoderView:EncoderStatusToColorConverter x:Key="ColorConverter"/>
    <Style x:Key="ItemContStyle" TargetType="{x:Type ListViewItem}">
        <Setter Property="Background" Value="{Binding Converter={StaticResource ColorConverter}}" />
        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    </Style>
</UserControl.Resources>
列挙型の値に基づいて、緑 - 黄 -

私は起こるがしたいことのListViewItemの背景色が赤から変化することです。これは、ビジネス・ロジック・ルールに基づいて更新されます。これは、現在だけ項目の初期表示のために、取り組んでいます。私はlistItemViewがバインドされているオブジェクトの「状態」プロパティを変更すると、背景が更新されません。私は、コレクションからオブジェクトを削除ステータスを変更し、再度コレクションに追加した場合、背景が更新されます。
私はオブジェクトIPropertyNotifyを作り、ステータスプロパティ変更されたセッターのイベントを投げて試してみたが、それはうまくいきませんでした。

私は更新するListView項目の背景を得るためにしなければならない特別な何かがあれば、誰もが知っているん。また、私はこの問題を解決する方法についての他のアイデア、感謝のために開いています。 ここにリストビューのためのXAMLです。 EncoderService.Encodersエンコーダオブジェクトの私のThreadSafeObservableCollectionです。

        <ListView  AutomationProperties.AutomationId="FinishScreen"  
                   ItemsSource="{Binding Path=EncoderService.Encoders}" 
                   x:Name="DataListView" Grid.RowSpan="1" Grid.Row="1" Margin="5"
                   ItemContainerStyle="{StaticResource ItemContStyle}"
                   Background="Azure">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="MAC">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ContentControl Content="{Binding Path=MAC}" ToolTip="{Binding Path=MAC}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="IDF">...
役に立ちましたか?

解決

問題が背景にバインディング削除し、それを追加しない限り変更されません全体エンコーダーオブジェクトを、取っているということです。エンコーダはINotifyPropertyChangedのを実装した場合でも、バインディングはまだ全体のエンコーダーオブジェクトを見て、エンコーダの特性は、あなたのEncoderStatusToColorConverterに関連するどの知る方法がないので、それ自体は更新されませんされます。

あなたのケース内の溶液はEncoderStatusToColorConverterに関連するだけでプロパティ(またはプロパティ)の背景にバインディングの範囲を狭めることです。あなたのバインディングのパス内のすべてのプロパティは、更新のために注目されます。したがって、たとえば、あなただけのステータスが必要な場合:

<Style x:Key="ItemContStyle" TargetType="{x:Type ListViewItem}">
    <Setter Property="Background" Value="{Binding Path=Status, Converter={StaticResource ColorConverter}}" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
あなたはエンコーダーにINotifyPropertyChangedのを実装したときにステータスの変更を通知する場合は、

この場合、バインディングはあなたのために更新する必要があります。これはまた、あなたはそれが唯一のステータス型を取るように、あなたのEncoderStatusToColorConverterを更新する必要がありますを意味します。

他のヒント

あなたはDataTemplateSelectorを使用してみましたか?私は基本的にはちょうどプロパティに基づいて描画色を変えているListBoxItemに使用されているテンプレートを変更するためにそれを使用します。ページがロードされた後、私はあなたがデータの変更をやっているシナリオを試していないが、それは動作しませんなぜ私は表示されません。

私はこのクラスを持っています:

public class UniqueWordDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item != null && item is WordScore)
        {
            WordScore word = item as WordScore;

            FrameworkElement elem = container as FrameworkElement;

            if (word.IsUnique)
                return
                    elem.FindResource("UniqueWordListTemplate") as DataTemplate;
            else
                return
                    elem.FindResource("WordListTemplate") as DataTemplate;
        }

        return null;
    }
}

私のコントロールのリソースでは、私はこの行を持ってます:

    <UserControl.Resources>
    ...
    <my:UniqueWordDataTemplateSelector x:Key="myDataTemplateSelector"/>

私もここで私の2つのテンプレートがあります:

    <DataTemplate x:Key="WordListTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="210" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Path=Word}" Background="{x:Null}" Foreground="White"/>
            <TextBlock Text="{Binding Path=Score}" Background="{x:Null}" Foreground="White"/>
        </Grid>
    </DataTemplate>
    <DataTemplate x:Key="UniqueWordListTemplate">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="210" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding Path=Word}" Background="{x:Null}" Foreground="Gold"/>
            <TextBlock Text="{Binding Path=Score}" Background="{x:Null}" Foreground="White"/>
        </Grid>
    </DataTemplate>

そして、私は私のリストボックスのために、次を使用します:

   <ListBox x:Name="PlayerList2" ItemTemplateSelector="{DynamicResource myDataTemplateSelector}" IsSynchronizedWithCurrentItem="True" Background="#FF252525"/>

私は、このアプローチが好きで、私はそれを追求するしようとするつもりですが、私は右のバット見る唯一の問題は、私は表形式のデータを示していますので、私は、GridViewコントロールを使用しているということです。私は、列ヘッダーが好き。しかし、私はそれを回避する方法を見つけることができると思います。私はおそらく手動で自分の列ヘッダーを入れます。

どのようにListItemのは、それはそれのデータテンプレートを更新する必要があることを通知しますでしょうか? これは、その有界項目のいずれかにPropertyChangedイベントをrecievesたびに起こるのでしょうか?

私はINotifyPropertyChangedのをimplimentしているかについて混乱かもしれないと思う。

だから私は、「エンコーダ」オブジェクトののObservableCollectionを持っています。 ObservableCollectionは明らかに観測可能である、と私はそれから物事を追加したり削除する場合、それが更新されます。しかし、それぞれの「エンコーダの」プロパティが更新されていません。私はそれが「エンコーダ」クラスはINotifyPropertyChangedのを実装し、イベントのプロパティの名前を送信しなければならないことを意味を理解したものから。 この正しい考え方とは?現時点では、それが動作していないので。私は、私はより多くのコードを投稿する前に、私は、正しい理論を持っていることを確認したい。

感謝

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top