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;
这一行就是问题所在。
您通常不使用数据绑定来设置自定义控件的外观。相反,您应该设置 Path
的 Name
并在初始化时设置其 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}" 成功了!谢谢大家
您好,我正在尝试制作一个带有 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;
这一行就是问题所在。
您通常不使用数据绑定来设置自定义控件的外观。相反,您应该设置 Path
的 Name
并在初始化时设置其 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}" 成功了!谢谢大家