Caliburn Micro在事件中重新加载数据

时间:2019-08-05 18:20:17

标签: c# wpf data-binding caliburn.micro

在处理CurrentLayoutIdChangedEvent事件时,后端会发回正确的数据,但不会调用模型的setter,因此UI不会反映更改。

遵循通常的模式在吸气剂中设置值。

属性:

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属性的设置器,因此LayoutName不会更改。

不确定我缺少什么,LayoutName(“未设置”)中的初始数据是否正确显示。 试图在dataProvider返回数据之后引入一个新事件,该事件仅调用NotifyOfPropertyChange(()=> Layout); -也不会给出任何错误或期望的结果。

1 个答案:

答案 0 :(得分:1)

相信我已正确理解您的担忧,Layout期间未调用属性LayoutName的设置程序,在该过程中您正在通知PopulateLayout的属性更改,因为您正在将值分配给私有变量_layout。 (不是属性Layout

您需要替换以下行

 _layout = _dataProvider.GetLayoutById(layoutId);

使用

 Layout= _dataProvider.GetLayoutById(layoutId);

或通过LayoutName方法通知PopulateLayout

_layout = _dataProvider.GetLayoutById(layoutId);
NotifyOfPropertyChange(() => LayoutName);