如何分配在xaml中充当占位符的基类的属性?

时间:2014-02-05 05:46:54

标签: c# wpf xaml user-controls

我有一个基类用于我的控件,以便从这个基类派生的所有控件都会引发同一个事件

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

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

其他: 当我在这里设置一个断点时:

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

我发现sender TradeEnterControl属性为MasterTrade null  enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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