WPF如何在使用Prism / Unity时重置/刷新绑定的viewmodel

时间:2017-09-08 04:02:31

标签: c# wpf mvvm prism

我正试图围绕Prism和Unity如何在WPF中工作,但目前已经被一项简单的任务阻止了。可能我对它是如何工作有误解。

如何刷新绑定的视图模型?

我有一个使用Prisms RegionManager加载用户控件的wpf应用程序:

<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" x:Name="mainContent" HorizontalAlignment="Center" Margin="0,25,0,0"/>

在我的用户控件中,我有一个字段供用户填写提交按钮和清除按钮(缩写用户控件内容)

<TextBox  Margin="10,3,15,0" Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" MinWidth="150" materialDesign:HintAssist.Hint="*Last Name" Style="{StaticResource MaterialDesignFloatingHintTextBox}" FontSize="16"/>
<Button Command="{Binding ClearCommand}" Style="{StaticResource MaterialDesignRaisedAccentButton}" Margin="0 12 8 0" Width="155"  ToolTip="Discard information entered and reset form" Background="#FF990B0B" Foreground="#FFECE9E9" BorderBrush="DarkRed">Cancel and Discard</Button>

我的字段的绑定工作得很好,我已将我的按钮绑定到一个命令,该命令将调用我想要重置表单的方法:

public class CheckInViewModel : BindableBase
{
    private IEventAggregator _eventAggregator;

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set { SetProperty(ref _lastName, value); }
    }

    public DelegateCommand ClearCommand { get; set; }

    private void ExecuteClear()
    {
        //reset form here  
    }
    public CheckInViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        ClearCommand = new DelegateCommand(ExecuteClear);
    }
}

我知道我可能只是在ExecuteClear方法中手动重置所有字段,但这看起来有点笨重且容易出错,因为实际上我有40多个字段需要处理。

我尝试将绑定字段移动到一个完全独立的模型,然后将该模型作为我的视图模型的属性,这样我就可以在clear方法中重新实例化它,但是这样做时似乎不更新视图。我想我必须缺少一个方法调用来取消绑定我的最后一个模型并重新绑定到新模型,但我无法弄清楚如何做到这一点,并且找不到任何关于这样做的文档。

尝试失败示例:

public class CheckInViewModel : BindableBase
{
    private IEventAggregator _eventAggregator;
    public CheckInModel checkInModel { get; set; }
    public DelegateCommand ClearCommand { get; set; }

    private void ExecuteClear()
    {
        checkInModel = new CheckInModel();
    }

    public CheckInViewModel(IEventAggregator eventAggregator)
    {
        checkInModel = new CheckInModel();
        _eventAggregator = eventAggregator;
        ClearCommand = new DelegateCommand(ExecuteClear);
    }

}


public class CheckInModel : BindableBase
{

    private string _lastName
    public string LastName
    {
        get { return _lastName; }
        set { SetProperty(ref _lastName, value); }
    }

}


<TextBox  Margin="10,3,15,0" Text="{Binding checkInModel.LastName, UpdateSourceTrigger=PropertyChanged}" MinWidth="150" materialDesign:HintAssist.Hint="*Last Name" Style="{StaticResource MaterialDesignFloatingHintTextBox}" FontSize="16"/>
<Button Command="{Binding ClearCommand}" Style="{StaticResource MaterialDesignRaisedAccentButton}" Margin="0 12 8 0" Width="155"  ToolTip="Discard information entered and reset form" Background="#FF990B0B" Foreground="#FFECE9E9" BorderBrush="DarkRed">Cancel and Discard</Button>

1 个答案:

答案 0 :(得分:1)

在您失败的尝试中,当您在checkInModel更新时,PropertyChanged属性不会引发ExecuteClear

将其更改为

private CheckInModel _checkInModel;
public ChechInModel CheckInModel
{
    get { return _checkInModel; }
    set { SetPropery( ref _checkInModel, value ); }
}

private void ExecuteClear()
{
    CheckInModel = new CheckInModel();
}

<TextBox Text="{Binding CheckInModel.LastName}"/>
<Button Content="Cancel and Discard" Command="{Binding ClearCommand}"/>

你应该没事。