在对象中附加匿名属性?

时间:2017-05-14 10:29:35

标签: c# wpf

我在WPF项目中工作,它拥有大量的用户控件。 对于某些表单,当用户关闭容器选项卡时,会显示确认关闭,对于其他表单,它们只是关闭。 所以我用

FrmAccounts FrmAcc = new FrmAccounts {Tag = "showConfirmClose"};

决定我需要关闭哪个标签。

并在结束时检查标签是否设置为showConfirmClose以显示确认消息。但我不喜欢使用Tag它在C#中表现不佳,我也想,如果我想发送更多数据怎么办(唯一的解决办法就是用逗号分隔它们在标签和Split他们,但这更糟糕。)

我找不到一个好的,高效的方法来完成这样的任务: 如果可能的话:

FrmAccounts FrmAcc = new FrmAccounts {new{ShowConfirmClose= true }};

1 个答案:

答案 0 :(得分:0)

附属物

您可以使用AttachedProperty存储对象的其他信息。但是,这些对象必须是DependencyObject s,否则它将无法正常工作。

这是一个例子。

在单独的类中定义附加属性(它可以是简单的static类或DependencyObject):

namespace YourNamespace
{
    public static class CloseConfirmation
    {
        public static readonly DependencyProperty IsActiveProperty = DependencyProperty.RegisterAttached(
           "IsActive",
           typeof(bool),
           typeof(CloseConfirmation));

        public static bool GetIsActive(DependencyObject obj)
        {
            return (bool)obj.GetValue(HiddenProperty);
        }

        public static void SetIsActive(DependencyObject obj, bool value)
        {
            obj.SetValue(HiddenProperty, value);
        }
    }
}

在XAML中,为对象设置附加属性值(WPF Window s,Page和其他DependencyObjects}:

<FrmAccounts xmlns:yns="YourNamespace"
    yns:CloseConfirmation.IsActive="true">
    <!-- Content -->
</FrmAccounts>

您可以在XAML定义中使用此附加属性,例如在触发器中。

您还可以在代码隐藏中访问其值:

FrmAccounts frm = new FrmAccounts();
CloseConfirmation.SetIsActive(frm, true);
var isActive = CloseConfirmation.GetIsActive(frm); // true

您不仅可以为boolint之类的简单类型创建附加属性,还可以为任何自定义类型创建附加属性。因此,如果需要传输大量数据,请使用自己的容器类。

标记对象

在.NET中使用Tag完全正常。实际上,任何UI类型都具有此属性,因此您可以将任何类型的对象附加到UI元素。但是,这些类型不能是匿名类型。您必须创建自己的容器类型:

class Container
{
    public bool IsConfirmationNeeded { get; }
    public IEnumerable<IItem> MyData { get; } // any data you need to pass
}

FrmAccounts frm = new FrmAccounts();
frm.Tag = new Container();

var container = (Container)frm.Tag;
var confirmation = container.IsConfirmationNeeded; // false by default