如何修复,ViewModel不使用Prism库绑定到View

时间:2019-01-03 13:52:46

标签: c# wpf prism

我正在开发WPF应用程序,并在其中将Prism与Unity IOC结合使用。对于在应用程序启动时显示的所有其他视图,它们似乎已适当绑定到预期的VM(由自动棱镜连接)。但是,当我导航到另一个视图(在选项卡控件中,现在只是一个视图)时,似乎无法将按钮绑定到Commands或将TextBlock绑定到VM的字符串属性。请注意,这在主视图及其区域内的视图中都可以正常工作。

除了告诉棱镜自动连接虚拟机之外,我还尝试从视图中以XAML分配DataContext,从后面的代码中分配DataContext。我什至在引导程序中添加了下面的第一个代码,以确定prism解析为的视图模型,并且在调试时它似乎是预期的VM。在上述所有情况下,还向我的VM类添加一个断点表明该VM已实例化。     //将其添加到我的引导程序中以检查viewModelName     受保护的重写void ConfigureViewModelLocator()     {         base.ConfigureViewModelLocator();

    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(x =>
    {
        var viewName = x.FullName;
        viewName = viewName.Replace(".Views.", ".ViewModels.");
        var viewAssemblyName = x.GetTypeInfo().Assembly.FullName;
        var suffix = viewName.EndsWith("View") ? "Model" : "ViewModel";
        var viewModelName = string.Format(CultureInfo.InvariantCulture, "{0}{1}, {2}", viewName, suffix, viewAssemblyName);
        return Type.GetType(viewModelName);
    });
    ViewModelLocationProvider.SetDefaultViewModelFactory(type => Container.Resolve(type));
}

这行代码是我浏览时将标签添加到的位置

<metro:MetroTabControl prism:RegionManager.RegionName="{x:Static constants:RegionNames.ContentRegion}" >
    <metro:MetroTabControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Rectangle Margin="2,3,2,3" 
               HorizontalAlignment="Stretch" 
               Fill="{DynamicResource AccentColorBrush}" 
               Height="2"/>
                <ContentControl Grid.Row="1" Content="{Binding Content}" />
            </Grid>
        </DataTemplate>
    </metro:MetroTabControl.ContentTemplate>
</metro:MetroTabControl>

使用RegionManager.RequestNavigate(Region, navigatePath)进行导航 这是我的视图模型的样子

public class MinerViewModel : Screen
{

    string searchText = "Seacrch";
    public ICommand SearchCommand { get; private set; }

    IList<FeedItem> temp;

    public MinerViewModel()
    {

        this.SearchCommand = new DelegateCommand(this.ToggleSearch, () => { return true; });
        //ToggleSearch();
    }


    public string SearchText
    {
        get => searchText;
        set
        {
            SetProperty<string>(ref searchText, value);
        }
    }

    public void ToggleSearch()
    {
        // do foo and bar
    }


}

请问我如何使事情按预期进行?

0 个答案:

没有答案