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