WPF依赖项属性 [英] WPF Dependency Property

查看:186
本文介绍了WPF依赖项属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力了解WPF中的依赖项属性,也许是因为我正在寻找的用例非常具体并且没有充分记录。

I'm struggling to get my head around dependency properties in WPF, maybe because the use case I'm looking for is very specific and not well documented.

我所拥有的是一个看起来像这样的自定义控件(请忽略所有可怕的代码,这是暂时的!):

What I have is a custom control that looks like this (please do ignore all the terrible code, it is temporary!):

<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>

我在主体内部称它为像这样的窗口:

I call it inside my main window like this:

<controls:FillGraph x:Name="HydroModel" />

,控件中的代码如下:

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();
    }
}
}

我想要成为的一切能够做的就是在主窗口中的自定义控件调用中说:

All that I want to be able to do is say in my custom control call in the main window:

<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" />

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

(Where FillPercentage is something in another script that you don't need to worry about). The control will be expanded, so it needs to stay as a custom control. I understand I may need dependency properties, but after trying many different ways I cannot figure out how to do this seemingly simple task. Help is appreciated.

推荐答案

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

There isn't a dependency property in your code.

这是一个依赖项属性:

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));
}

如Ayyappan Subramanian所建议的, propdp 片段将帮助创建样板。请小心传递给 DependencyProperty.Register()的参数,并确保传递给 new PropertyMetadata()是正确的类型。 0.0f 是浮点数。如果您为 float 属性传递整数 0 ,它将在运行时引发异常。

As Ayyappan Subramanian suggests, the propdp snippet in Visual Studio will help create the boilerplate. Just be careful with the parameters you pass to DependencyProperty.Register(), and make sure the default value you pass to new PropertyMetadata() is the correct type. 0.0f is a float. If you pass integer 0 for a float property, it'll throw an exception at runtime.

此处的常规属性公共浮动百分比是可选的。它就在那里供您使用代码。 XAML绝对不会碰到它(如果您怀疑我,请在getter和setter中设置断点)。这是有关依赖项属性的一部分。

The regular property public float Percentage here is optional. It's just there for your code to use. XAML won't ever touch it at all (put breakpoints in the getter and setter if you doubt me). That's part of what's special about dependency properties.

以下是在用户控件XAML中使用它的方法。注意绑定的 StringFormat 参数。

And here's how to use it in your usercontrol XAML. Note the StringFormat parameter to the binding.

<Grid>
    <TextBlock 
        Text="{Binding Percentage, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat='Fill Percentage: {0:#.##}%'}" 
        />
</Grid>

注意:如果您的百分比以0到1的范围表示,大于0到100,请使用 p 百分比格式。小数点后两位使用 p2 。我们省略了,因为格式字符串提供了这一点。

Note: If your percentage is expressed in the range 0 to 1 rather than 0 to 100, use the p percent format instead. We'll use p2 for two digits after the decimal point. We omit the % because the format string provides that.

    <TextBlock 
        Text="{Binding Percentage, StringFormat='Fill Percentage: {0:p2}', RelativeSource={RelativeSource AncestorType=UserControl}}" 
        />

假设问题是基于视图模型的 FillPercentage 属性并正确实现 INotifyPropertyChanged

This XAML from your question is fine just as it is, assuming that the viewmodel has a FillPercentage property and correctly implements INotifyPropertyChanged:

<controls:FillGraph x:Name="HydroModel" Percentage="{Binding FillPercentage}" />

这篇关于WPF依赖项属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆