Caliburn Micro 重新加载事件数据
Caliburn Micro reload data on event
在处理 CurrentLayoutIdChangedEvent 事件时,后端发回正确的数据,但未调用模型的 setter,因此,UI 不会反映更改。
按照通常的模式设置 getter 中的值。
属性:
private LayoutModel _layout;
private string _layoutName;
public LayoutModel Layout
{
get { return _layout; }
set { _layout = value; NotifyOfPropertyChange(() => LayoutName); }
}
public string LayoutName
{
get { return _layout == null ? "Not set" : _layout.Name; }
set { _layoutName = value; NotifyOfPropertyChange(() => FullArea); }
}
事件:
public void Handle(CurrentLayoutIdChangedEvent message) => PopulateLayout(message.LayoutId);
函数:
private void PopulateLayout(int layoutId)
{
if (layoutId > 0)
{
try
{
_layout = _dataProvider.GetLayoutById(layoutId);
}
catch (Exception ex)
{
_logger.Error(ex, "Invalid Layout returned with '{layoutId}', exiting.", layoutId);
}
}
else
{
_logger.Error("Invalid LayoutId, aborting.");
}
}
部分观点:
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="{x:Static lang:Resources.Txt_LayoutName}" />
<TextBlock x:Name="LayoutName" Margin="10 0 0 0" />
</StackPanel>
收到事件时调用函数并将数据加载到_layout中,但是public 属性的setter没有被调用,所以LayoutName不会' t改变。
不知道我错过了什么,LayoutName ("Not set") 中的初始数据显示正确。
试图在 dataProvider returns 数据之后引入一个新事件,它只调用 NotifyOfPropertyChange(() => Layout); - 也没有给出任何错误或期望的结果。
请相信我正确理解了您的问题 属性 Layout
的 Setter,您在其中通知 LayoutName
的 属性 更改未被调用在 PopulateLayout
期间,因为,您正在为私有变量 _layout
赋值。 (不是 属性 Layout
)
您需要替换以下行
_layout = _dataProvider.GetLayoutById(layoutId);
和
Layout= _dataProvider.GetLayoutById(layoutId);
或者从PopulateLayout
方法通知LayoutName
_layout = _dataProvider.GetLayoutById(layoutId);
NotifyOfPropertyChange(() => LayoutName);
在处理 CurrentLayoutIdChangedEvent 事件时,后端发回正确的数据,但未调用模型的 setter,因此,UI 不会反映更改。
按照通常的模式设置 getter 中的值。
属性:
private LayoutModel _layout;
private string _layoutName;
public LayoutModel Layout
{
get { return _layout; }
set { _layout = value; NotifyOfPropertyChange(() => LayoutName); }
}
public string LayoutName
{
get { return _layout == null ? "Not set" : _layout.Name; }
set { _layoutName = value; NotifyOfPropertyChange(() => FullArea); }
}
事件:
public void Handle(CurrentLayoutIdChangedEvent message) => PopulateLayout(message.LayoutId);
函数:
private void PopulateLayout(int layoutId)
{
if (layoutId > 0)
{
try
{
_layout = _dataProvider.GetLayoutById(layoutId);
}
catch (Exception ex)
{
_logger.Error(ex, "Invalid Layout returned with '{layoutId}', exiting.", layoutId);
}
}
else
{
_logger.Error("Invalid LayoutId, aborting.");
}
}
部分观点:
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="{x:Static lang:Resources.Txt_LayoutName}" />
<TextBlock x:Name="LayoutName" Margin="10 0 0 0" />
</StackPanel>
收到事件时调用函数并将数据加载到_layout中,但是public 属性的setter没有被调用,所以LayoutName不会' t改变。
不知道我错过了什么,LayoutName ("Not set") 中的初始数据显示正确。 试图在 dataProvider returns 数据之后引入一个新事件,它只调用 NotifyOfPropertyChange(() => Layout); - 也没有给出任何错误或期望的结果。
请相信我正确理解了您的问题 属性 Layout
的 Setter,您在其中通知 LayoutName
的 属性 更改未被调用在 PopulateLayout
期间,因为,您正在为私有变量 _layout
赋值。 (不是 属性 Layout
)
您需要替换以下行
_layout = _dataProvider.GetLayoutById(layoutId);
和
Layout= _dataProvider.GetLayoutById(layoutId);
或者从PopulateLayout
方法通知LayoutName
_layout = _dataProvider.GetLayoutById(layoutId);
NotifyOfPropertyChange(() => LayoutName);