WPF依赖项属性

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是另一个脚本中您无需担心的东西)。该控件将被扩展,因此需要保留为自定义控件。我知道我可能需要依赖项属性,但是在尝试了许多不同的方法后,我无法弄清楚如何执行此看似简单的任务。感谢帮助。

15e*_*153 5

您的代码中没有依赖项属性。

这是一个依赖属性:

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)