简体   繁体   中英

WPF Custom control binding image source

I have a custom control based on a button, and I put an image inside. I can set the source of the image in the xaml, but if I try and bind it, it doesn't work.

Generic.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControl">

<Style TargetType="{x:Type local:MyCustomControl}" BasedOn = "{StaticResource {x:Type Button}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
                <Grid x:Name="InnerGrid">
                    <Image Source="pathname"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>
</ResourceDictionary>

This works just fine, however if I replace the <Image Source="pathname"/> with <Image Source={Binding MyImage, RelativeSource={RelativeSource Self}}"/> , and reference a Delegate Property in the class, it breaks.

MyCustomControl.cs

public class MyCustomControl : Button
{
    static DependencyProperty m_myimage = null;
    private DependencyProperty MyImageProperty
    {
        get
        {
            return m_myimage;
        }
    }
    public BitmapImage MyImage
    {
        get
        {
            return (BitmapImage)GetValue(MyImageProperty);
        }

        set
        {
            SetValue(MyImageProperty, value);
        }
    }

    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        MyImage = new BitmapImage(new Uri(pathname));
    }

    private static void RegisterDependencyProperties()
    {
        if (m_myimage == null)
        {
            m_myimage = DependencyProperty.Register("MyImage",
                typeof(BitmapImage), typeof(MyCustomControl), null);
        }
    }

    static MyCustomControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), 
            new FrameworkPropertyMetadata(typeof(MyCustomControl)));
        RegisterDependencyProperties();
    }
}

How can I get it to work?

Figured it out myself after about 2 hours. The xaml binding should look like,

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:MyCustomControl}">
            <Grid x:Name="InnerGrid">
                <Image Source="{Binding MyImage, RelativeSource={RelativeSource TemplatedParent}}"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Note that the binding relative resource went from RelativeSource={RelativeSource Self} to RelativeSource={RelativeSource TemplatedParent}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM