1

<Color x:Key="SomeColor" />Caliburn Micro で依存関係プロパティにバインドするにはどうすればよいですか?

実行時に変更でき、Colorそれを使用するすべてのものですぐに更新できる必要があります。

解決:


SomeClassView.xaml の XAML

<SomeControl.Resources>
    <SolidColorBrush x:Key="ControlBrush" />
</SomeControl.Resources>

SomeClassViewModel.cs の C#

[Export(typeof(MainWindowViewModel))]
public class MainWindowViewModel : PropertyChangedBase
{
    private SolidColorBrush _controlBrush;

    public SolidColorBrush ControlBrush
    {
        get { return _controlBrush; }
        set
        {
            _controlBrush = value;
            NotifyOfPropertyChange(() => ControlBrush);
        }
    }
}

問題はまさにCharlehが言ったことでした。WPFのすべてがDependencyPropertyになるわけではないことを完全に忘れていました。

4

1 に答える 1

3

通常、オブジェクトを直接バインドすることはできません。ほとんどの UI オブジェクトがそれを期待しているため、(単色の場合)Colorを使用する必要があります。SolidColorBrush

例えば

TextBox.BackgroundのサブクラスBrushですSolidColorBrush。次のような異なる塗りつぶしを生成する他のタイプのブラシがあります。LinearGradientBrush

ここを見てください:

WPF/XAML で背景色をバインドするにはどうすればよいですか?

予想される内容と XAML のスクリーンショットを提供していただけますか?

編集:

さて、あなたが望むものは達成するのが非常に簡単で、Caliburn.Microとはまったく関係ありません:)

通常どおりスタイルを作成しますが、 を使用してブラシColorプロパティを動的にバインドしDynamicResourceます。色自体を更新すると、リソース バインディングが再度評価され、色が変更されます。

XAML の例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Color x:Key="TestColor" A="255" R="255" G="0" B="0"></Color>
        <Style x:Key="ButtonStyle" TargetType="Button">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush Color="{DynamicResource TestColor}"></SolidColorBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Button Click="Button_Click" Style="{StaticResource ButtonStyle}">Red</Button>
            <Button Click="Button_Click_1" Style="{StaticResource ButtonStyle}">Blue</Button>
        </StackPanel>
    </Grid>
</Window>

分離コード:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Resources["TestColor"] = Color.FromArgb(255, 255, 0, 0);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Resources["TestColor"] = Color.FromArgb(255, 0, 0, 255);
        }
    }
}
于 2012-12-08T19:02:11.197 に答える