我有一个基类用于我的控件,以便从这个基类派生的所有控件都会引发同一个事件
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
但是隐藏在树的深处,我可以看到已经分配了MasterTrade
属性,
答案 0 :(得分:0)
也许我错了,但是 - 你是否将该UserControl的 Content 设置为CollRepoTradeEnterControl,而不是设置UserControl本身?如果是 - 那么,是的,你没有设置你认为你属性的属性。元素的内容和元素是两个截然不同的东西。 如果您想要将一个新对象分配给是那个UserControl,那么您可以给它一个名称,因此该元素将作为该名称的实例成员提供给您的代码隐藏类。但是,这很麻烦而且有问题。更好的方法是使可绑定属性引用此类的对象。而不是尝试将某些内容分配给XAML定义的对象,而是将其分配给view-model属性并让WPF执行它。 另外,不要忘记 - 对于需要记住它们的属性并指向正确代码的属性,请考虑是否需要将其定义为虚拟代码。