0

複数のリストボックス項目と内部のいくつかのテキストブロックのテンプレートを作成しました。設定で、ユーザーはアプリの背景を黒または白に変更できます (それに応じてテキストブロックの前景色を反対に変更する必要があります)。textblocksテキストを 1 つのプロパティ(itemlist (observablecollection) の)にバインドし、前景を別のプロパティ(色のコンバーターを使用)にバインドするにはどうすればよいですか?

私がやろうとしていること:

<DataTemplate x:Key="ArticleItemTemplateClassic">
        <Grid>
            <!-- ... --->
             <TextBlock Text="{Binding Description}"
                        Foreground="{Binding SettingsFile.BlackBackgroundEnabled,
                        Converter={StaticResource InverseBackgroundColorConverter}}"/>
            <!-- The Context of the Foreground (SettingsFile.BlackBackgroundEnabled) -->
            <!-- should be not the same as where I bind Description -->
            </StackPanel>
            <!-- ... --->
        </Grid>
    </DataTemplate>

ありがとうございました!

4

2 に答える 2

0

DataContext強制された場合は、アイテムごとに異なるものを明示的に指定できます。なぜ同じように見える2つのプロパティがDataTemplate異なるコンテナに配置されるのかはわかりませんが、

于 2013-03-02T17:25:45.763 に答える
0

これを行うには、Foreground プロパティのバインディングのソースを指定する必要があります。これはさまざまな方法で実行できますが、その 1 つの例は、Settings クラスをリソースとして公開することです。

例えば:

<Grid x:Name="LayoutRoot">
    <Grid.Resources>
        <!-- If you want to use SettingsFile as a static, you might want to expose an accessor/wrapper class for it here instead. -->
        <settings:SettingsFile x:Name="SettingsFileResource" />
    </Grid.Resources>
    <ListBox ItemsSource="{Binding MyItems}">
        <ListBox.ItemTemplate>
            <DataTemplate x:Key="ArticleItemTemplateClassic">
                <Grid>
                    <!-- ... -->
                    <TextBlock Text="{Binding Description}"
                               <!-- Now change your Binding Path to the target property, and set the source to the resource defined above. -->
                    Foreground="{Binding BlackBackgroundEnabled, Source={StaticResource SettingsFileResource}, Converter={StaticResource InverseBackgroundColorConverter}}"/>

                    <StackPanel />
                    <!-- ... -->
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

代わりに、代わりに AttachedProperty を使用する方がクリーンな場合があります。例えば:

public static bool GetBlackBackgroundEnabled(DependencyObject obj)
{
    return (bool)obj.GetValue(BlackBackgroundEnabledProperty);
}

public static void SetBlackBackgroundEnabled(DependencyObject obj, bool value)
{
    obj.SetValue(BlackBackgroundEnabledProperty, value);
}

// Using a DependencyProperty as the backing store for BlackBackgroundEnabled.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty BlackBackgroundEnabledProperty =
    DependencyProperty.RegisterAttached("BlackBackgroundEnabled", typeof(bool), typeof(Control), new PropertyMetadata(false, (s, e) =>
        {
            Control target = s as Control;
            SolidColorBrush brush = new SolidColorBrush();

            // Logic to determine the color goes here
            if (GetBlackBackgroundEnabled(target))
            {
                brush.Color = something;
            }
            else
            {
                brush.Color = somethingElse;
            }

            target.Foreground = brush;
        }));

次に、次のように使用します。

<TextBlock settings:SettingsFile.BlackBackgroundEnabled="True" />
于 2013-03-02T18:53:15.640 に答える