Aid*_*anH 2 c# wpf xaml dependencies properties
我正在努力了解WPF中的依赖项属性,也许是因为我正在寻找的用例非常具体并且没有充分记录。
我拥有的是一个看起来像这样的自定义控件(请忽略所有可怕的代码,这是临时的!):
<UserControl x:Class="HydroAccessory.Controls.FillGraph"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HydroAccessory.Controls"
mc:Ignorable="d"
SizeChanged="FillGraph_SizeChanged"
d:DesignHeight="200" d:DesignWidth="300">
<Grid>
<TextBlock x:Name="PercentageTB" Text="Fill Percentage: 0%" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
我在主窗口中这样称呼它:
<controls:FillGraph x:Name="HydroModel" />
Run Code Online (Sandbox Code Playgroud)
控件内部的代码如下:
using System;
using System.Windows;
using System.Windows.Controls;
namespace HydroAccessory.Controls
{
public partial class FillGraph : UserControl
{
private float percentage;
public float Percentage
{
get
{
return percentage;
}
set
{
percentage = value;
PercentageTB.Text = String.Format("Fill Percentage: {0}", percentage.ToString() + "%");
}
}
public FillGraph()
{
InitializeComponent();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我要做的就是在主窗口的自定义控件调用中说:
<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" />
Run Code Online (Sandbox Code Playgroud)
(其中FillPercentage是另一个脚本中您无需担心的东西)。该控件将被扩展,因此需要保留为自定义控件。我知道我可能需要依赖项属性,但是在尝试了许多不同的方法后,我无法弄清楚如何执行此看似简单的任务。感谢帮助。
您的代码中没有依赖项属性。
这是一个依赖属性:
public partial class FillGraph : UserControl
{
public FillGraph()
{
InitializeComponent();
}
public float Percentage
{
get { return (float)GetValue(PercentageProperty); }
set { SetValue(PercentageProperty, value); }
}
// Using a DependencyProperty as the backing store for Percentage. This
// enables animation, styling, binding, etc...
public static readonly DependencyProperty PercentageProperty =
DependencyProperty.Register("Percentage", typeof(float),
typeof(FillGraph), new PropertyMetadata(0.0f));
}
Run Code Online (Sandbox Code Playgroud)
正如Ayyappan Subramanian所建议的那样,propdpVisual Studio中的代码片段将帮助创建样板。请注意传递给的参数DependencyProperty.Register(),并确保传递给的默认值new PropertyMetadata()是正确的类型。0.0f是一个浮点数。如果0为float属性传递整数,则它将在运行时引发异常。
public float Percentage这里的常规属性是可选的。它就是在那里供您使用的代码。XAML根本不会使用它(如果您怀疑我,请在getter和setter中设置断点)。这是依赖项属性特殊之处的一部分。
这是在用户控件XAML中使用它的方法。注意StringFormat绑定的参数。
<Grid>
<TextBlock
Text="{Binding Percentage, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat='Fill Percentage: {0:#.##}%'}"
/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
注意:如果百分比以0到1而不是0到100的范围表示,请改用p百分比格式。我们将使用p2小数点后两位数。我们省略了,%因为格式字符串提供了这一点。
<TextBlock
Text="{Binding Percentage, StringFormat='Fill Percentage: {0:p2}', RelativeSource={RelativeSource AncestorType=UserControl}}"
/>
Run Code Online (Sandbox Code Playgroud)
假设viewmodel有一个FillPercentage属性并正确实现了,那么您提出的这个XAML就可以了INotifyPropertyChanged:
<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" />
Run Code Online (Sandbox Code Playgroud)