【问题标题】:How to assign property of a baseclass which is acted as a placeholder in xaml?如何分配在 xaml 中充当占位符的基类的属性?
【发布时间】:2014-02-05 05:46:53
【问题描述】:

我的控件有一个基类,因此从这个基类派生的所有控件都会引发相同的事件

public class TradeEnterControl: UserControl
{
    TradeData masterTrade;
    public TradeData MasterTrade
    {
        get
        {
            return masterTrade;
        }
        set
        {
            masterTrade = value;
        }
    }
    public delegate void TradeUpdateRoutedEventHandler(object sender, EventArgs e);
    public static readonly RoutedEvent TradeUpdateEvent;
    static TradeEnterControl()
    {
        TradeUpdateEvent = EventManager.RegisterRoutedEvent("TradeUpdate", RoutingStrategy.Bubble,
            typeof(TradeUpdateRoutedEventHandler), typeof(TradeEnterControl));
    }
    #region Trade Update Event
    public event TradeUpdateRoutedEventHandler TradeUpdate
    {
        add
        {
            base.AddHandler(TradeUpdateEvent, value);
        }
        remove
        {
            base.RemoveHandler(TradeUpdateEvent, value);
        }
    }

    #endregion

    public void RaiseTradeUpdateEvent()
    {
        RaiseEvent(new RoutedEventArgs(TradeUpdateEvent));
    }
}

所以我的控件将继承TradeEnterControl

public partial class CollRepoTradeEnterControl : TradeEnterControl

我没有重新定义MasterTrade 属性。

在我的 XAML 中,我有 TradeEnterControl 作为占位符,就像这样

<my:TradeEnterControl Grid.Column="0" Grid.Row="1" Margin="3,3,3,3" HorizontalAlignment="Stretch" x:Name="TradeEnterControl"  VerticalAlignment="Stretch" TradeUpdate="TradeEnterControl_TradeUpdate" />

在运行时,我将TradeEnterControl 分配为,

TradeEnterControl.Content = new CollRepoTradeEnterControl();

当我更新我的CollRepoTradeEnterControl 中的MasterTrade 属性时, TradeEnterControl 中的 MasterTrade 属性仍为 null。我不知道为什么,是因为我将其分配为TradeEnterControl.Content = new CollRepoTradeEnterControl(); 的方式吗?如何确保在分配 CollRepoTradeEnterControl MasterTrade 属性时,TradeEnterControl 中的 MasterTrade 属性也被分配?

补充: 当我在这里设置断点时:

    private void TradeEnterControl_TradeUpdate(object sender, EventArgs e)
    {
        SplitTradeControl.SplitEntryGroup.MasterTrade = ((TradeEnterControl)sender).MasterTrade;
    }

我发现,senderTradeEnterControl MasterTrade 属性是 null

但隐藏在树的深处,我可以看到 MasterTrade 属性已分配,

【问题讨论】:

  • MasterTrade 属性不会像基类和子类一样单独分配。当它从孩子设置时,它将直接设置到基础。你从哪里得到 MasterTradeTradeEnterControl 是空的?
  • @Sankarann 来自 MainWindow.xaml 后面的代码,其中包含 TradeEnterControl

标签: c# wpf xaml user-controls


【解决方案1】:

也许我弄错了,但是 - 您是否将该 UserControl 的 Content 设置为 CollRepoTradeEnterControl,而不是设置 UserControl 本身?如果是这样 - 那么,是的,您没有设置您认为的属性。元素的内容和元素是两个不同的东西。 如果您想将一个新对象分配给 be 该 UserControl,那么您可以给它一个名称,因此该元素将作为该名称的实例成员可供您的代码隐藏类使用。但是,这是混乱和有问题的。一个更好的方法是让一个可绑定的属性引用这个类的一个对象。与其尝试将某些内容分配给您的 XAML 定义的对象,不如将其分配给您的视图模型属性并让 WPF 做这件事。 另外,不要忘记 - 对于需要记住它们是什么并指向正确代码的属性,请考虑是否需要将其定义为虚拟。

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2012-11-02
    相关资源
    最近更新 更多