0

次のスニペットでは、色を (文字列として) コントロールに渡し、バインディングを使用してボタンの背景に色を割り当てようとしています。ただし、無視されます。何がうまくいかないのですか?

XAML は次のとおりです。

<Window x:Class="SDKSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SDKSample"
        Title="MainWindow" Height="350" Width="525">

    <DockPanel>
        <DockPanel.Resources>
            <local:MyData x:Key="myDataSource"   />
        </DockPanel.Resources>
        <DockPanel.DataContext>
            <Binding Source="{StaticResource myDataSource}" />
        </DockPanel.DataContext>
        <!--<Button Background="Red" Width="250" Height="25">RED</Button>-->
        <Button Background="{Binding Source={StaticResource myDataSource}, Path=ColorName}" Width="150" Height="30">I'm bound to be red</Button>

    </DockPanel>        
</Window>

コードビハインドは次のとおりです。

namespace SDKSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MyData md = new MyData("Red");
            this.DataContext = md.ColorName;

        }
    }

    public class MyData
    {
        private Color colorname;
        public MyData()
        {
        }

        public MyData(string value)
        {
            Color col = (Color)ColorConverter.ConvertFromString(value);
            this.colorname = col;
        }

        public Color ColorName
        {
            get { return colorname; }
            set
            {
                this.colorname = value;
            }
        }
    }
}
4

1 に答える 1

1

ここにはいくつかの問題があります。最初の問題は非常に一般的です。多くの人が を に代入しようとColorBrushますが、これを直接行うことはできません。これを回避する 1 つの方法は、 を の に代入するcolorことSolidColorbrushですBackground

例:

<Button Content="I'm bound to be red" Width="150" Height="30">
    <Button.Background>
        <SolidColorBrush Color="{Binding ElementName=UI,Path=MyData.ColorName}" />
    </Button.Background>
</Button>

もう1つの問題は、を割り当てる方法ですDataContext。実際に行う必要があるのはMyData、ウィンドウにプロパティを作成し、それをに割り当てることだけButtonです。

ここに例があります。

Xaml:

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="124" Width="464" Name="UI" >

        <DockPanel DataContext="{Binding ElementName=UI}"> <!--set the DataContext to your Window (using the Name of the Window)-->
            <Button Content="I'm bound to be red" Width="150" Height="30">
                <Button.Background>
                    <SolidColorBrush Color="{Binding MyData.ColorName}" />
                </Button.Background>
            </Button>
        </DockPanel>
</Window>

コード

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private MyData _myData;

    public MainWindow()
    { 
        InitializeComponent();
        MyData = new MyData("Red");
    }

    public MyData MyData
    {
        get { return _myData; }
        set { _myData = value; NotifyPropertyChanged("MyData"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
于 2013-02-22T01:50:21.933 に答える