DataContext 未在带有路径数据的自定义按钮中设置

DataContext is not getting set inside Custom Button with Path Data

您好,我正在尝试制作一个带有 PathData 的自定义按钮。到目前为止,我已经设法查看了其中的路径。但是我的 Button 没有接受 MVVM 命令。

自定义按钮 XAML

<Button x:Class="My_Class.CustomControls.MyButtonWithPath"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="480" d:DesignWidth="480">
    <Grid>
        <Path  Data="{Binding}" Name="path"/>
    </Grid>
</Button>

按钮代码隐藏

public partial class MyButtonWithPath : Button
{
    public MyButtonWithPath()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private static string _pathDatay;
    public string PathDatay
    {
        get { return _pathDatay; }
        set { _pathDatay = value; }
    }

    public static readonly DependencyProperty PathDataProperty =
        DependencyProperty.Register("PathDatay", typeof(string), typeof(MyButtonWithPath), new PropertyMetadata(pathDataCallback));

    private static void pathDataCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        _pathDatay = (string)e.NewValue;
    }
}

用法 XAML

<converters:KeyToValueConverter x:Key="conv"/>
<custom:MyButtonWithPath PathDatay="{Binding ConverterParameter=tv, Converter={StaticResource conv}}" />

转换器

 public class KeyToValueConverter : IValueConverter
 {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            return Utils.GetPathData(parameter.ToString());
        }
        catch (Exception c)
        {
            throw c;
        }

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new System.NotImplementedException();
    }
}

实用程序Class

public static string GetPathData(string key)
    {
        Dictionary<string, string> dictionary = new Dictionary<string, string>();

        dictionary.Add("tv", "etc etc etc......");
        return dictionary[key];
    }

问题

每当我在按钮的用法中编写命令时,它都会显示未找到的错误,因为它在我的自定义按钮中查找命令而不是我的 MainViewModel(仅供参考,我有一个名为 MainViewModel 的 ViewModel,我将把命令相关代码)

我的猜测

我用这个 "this.DataContext=this;" 将 Button 的 DataContext 设置为它自己,但是如果我省略了这一行,那么 Path 就不会显示。请指导我正确设置这些东西

解决方案

如下

你是对的,this.DataContext=this;这一行就是问题所在。
您通常不使用数据绑定来设置自定义控件的外观。相反,您应该设置 PathName 并在初始化时设置其 Data 属性。您可以通过覆盖 OnApplyTemplate:

来做到这一点
public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    Path p = GetTemplateChild("path") as Path;
    p.Data = ...
}

我搞砸了代码,@Domysee 指导我正确的方法。我的更正--

自定义按钮XAML(不需要)

按钮代码隐藏,用法在XAML,Converter,Utils(与之前相同)

附加部分(样式模板)

 <Style x:Key="MyButtonWithPathStyle" TargetType="CustomControls:MyButtonWithPath">
      <Setter Property="Template">
           <Setter.Value>
               <ControlTemplate TargetType="CustomControls:MyButtonWithPath">
                   <Grid Background="Transparent">
                        <Path x:Name="path" Data="{Binding}" DataContext="{TemplateBinding PathDatay}"/>
                   </Grid>
                </ControlTemplate>
            </Setter.Value>     
         </Setter>
   </Style>

就是这样! DataContext="{TemplateBinding PathDatay}" 成功了!谢谢大家