lundi 16 mars 2015

RelativeSource-Binding for UserControl


Vote count:

0




I've created a UserControl for displaying a Hyperlink in my application.


The markup of this UserControl looks like:



<UserControl x:Class="MVVMExample.View.UserControls.ActionLink"
xmlns="http://ift.tt/o66D3f"
xmlns:x="http://ift.tt/mPTqtT"
xmlns:mc="http://ift.tt/pzd6Lm"
xmlns:d="http://ift.tt/pHvyf2"
mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<TextBlock Margin="5">
<Hyperlink Command="{Binding LinkCommand}" CommandParameter="{Binding LinkCommandParameter}">
<TextBlock Text="{Binding LinkText, UpdateSourceTrigger=PropertyChanged}"/>
</Hyperlink>
</TextBlock>
</Grid>
</UserControl>


The DataContext of this UserControl is in the CodeBehind which looks like:



public partial class ActionLink : UserControl, INotifyPropertyChanged
{
public static readonly DependencyProperty LinkTextProperty = DependencyProperty.Register(
"LinkText", typeof (string), typeof (ActionLink), new PropertyMetadata(LinkTextChanged));

public static readonly DependencyProperty LinkCommandParameterProperty = DependencyProperty.Register(
"LinkCommandParameter", typeof (object), typeof (ActionLink),
new PropertyMetadata(LinkCommandParameterChanged));

public static readonly DependencyProperty LinkCommandProperty = DependencyProperty.Register(
"LinkCommand", typeof (ICommand), typeof (ActionLink), new PropertyMetadata(LinkCommandChanged));

public ActionLink()
{
InitializeComponent();
}

public object LinkCommandParameter
{
get { return GetValue(LinkCommandParameterProperty); }
set { SetValue(LinkCommandParameterProperty, value); }
}

public string LinkText
{
get { return (string) GetValue(LinkTextProperty); }
set
{
SetValue(LinkTextProperty, value);
OnPropertyChanged();
}
}

public ICommand LinkCommand
{
get { return (ICommand) GetValue(LinkCommandProperty); }
set { SetValue(LinkCommandProperty, value); }
}

public event PropertyChangedEventHandler PropertyChanged;

private static void LinkTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActionLink) d).LinkText = (string) e.NewValue;
}

private static void LinkCommandParameterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActionLink) d).LinkCommandParameter = e.NewValue;
}

private static void LinkCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((ActionLink) d).LinkCommand = (ICommand) e.NewValue;
}

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}


Everything just works fine.


Now if I want to use this UserControl with the Command-Binding I have to do the following:



<userControls:ActionLink LinkText="View customers" LinkCommand="{Binding DataContext.ViewCustomersCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>


If I use a Button instead I don't have to provide that RelativeSource. Is there a opportunity that I also don't have to provide a RelativeSource on binding properties of custom created UserControls?



asked 1 min ago

Tomtom

3,706






RelativeSource-Binding for UserControl

Aucun commentaire:

Enregistrer un commentaire