MVVM:绑定一个 ViewModel,它将构造函数参数传递给 UserControl

发布于 2024-10-06 03:16:58 字数 3462 浏览 0 评论 0原文

我的 WPF 应用程序有一个 MainWindow,其中包含一个名为 TvshowGridView 的用户控件。

MainWindow:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:NevermissClient"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:views="clr-namespace:NevermissClient.Views"
    x:Class="NevermissClient.MainWindow"
    x:Name="Window">
    <Grid x:Name="LayoutRoot">
        <views:TvshowGridView x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/>
    </Grid>
</Window>

TvshowGridView:

<UserControl
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:viewModels="clr-namespace:NevermissClient.ViewModels"
     xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
     mc:Ignorable="d"
     x:Class="NevermissClient.Views.TvshowGridView"
     d:DesignWidth="640" d:DesignHeight="480">

    <Grid x:Name="LayoutRoot">

        <telerik:RadGridView x:Name="TvshowGrid" d:LayoutOverrides="Width, Height" AutoGenerateColumns="False"  ItemsSource="{Binding AllEpisodes}" IsReadOnly="False">
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding TvshowName, Mode=TwoWay}" Header="Tvshow Name" IsReadOnly="False"/>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding Name, Mode=TwoWay}" Header="Episode Name"/>

                <telerik:GridViewDataColumn DataMemberBinding="{Binding Airdate, Mode=TwoWay}" Header="Airdate"/>
            </telerik:RadGridView.Columns>
        </telerik:RadGridView>

    </Grid>
</UserControl>

我希望绑定到 TvshowGridView 的视图模型 TvshowGridViewModel 有一个带有参数的构造函数。

public class TvshowGridViewModel : BaseViewModel
{
    private EpisodeRepository _episodeRepository;
    private TvshowRepository _tvshowRepository;

    public ObservableCollection<EpisodeViewModel> AllEpisodes { get; private set; }

    public TvshowGridViewModel(EpisodeRepository episodeRepository, TvshowRepository tvshowRepository)
    {
        _episodeRepository = episodeRepository;
        _tvshowRepository = tvshowRepository;

        CreateAllEpisodes();
    }
    ...
}

这些参数在 MainWindowViewModel(连接到 MainWindow 的视图模型)中定义。 - 所以这似乎是创建 TvshowGridViewModel 的合理位置。

public class MainWindowViewModel : BaseViewModel
{
    readonly TvshowGridViewModel _tvshowGridViewModel;
    readonly EpisodeRepository _episodeRepository;
    readonly TvshowRepository _tvshowRepository;

    public MainWindowViewModel()
    {
        _episodeRepository = new EpisodeRepository("c:\data.xml");
        _tvshowRepository = new TvshowRepository("c:\data.xml");

        _tvshowGridViewModel = new TvshowGridViewModel(_episodeRepository, _tvshowRepository);
    }

    public TvshowGridViewModel TvshowGridViewModel { get; }
    ...
}

如何将实例化的 TvshowGridViewModel 绑定到 TvshowGridView? (避免代码隐藏)

谢谢!

My WPF app has a MainWindow containing a usercontrol called TvshowGridView.

MainWindow:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:NevermissClient"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:views="clr-namespace:NevermissClient.Views"
    x:Class="NevermissClient.MainWindow"
    x:Name="Window">
    <Grid x:Name="LayoutRoot">
        <views:TvshowGridView x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/>
    </Grid>
</Window>

TvshowGridView:

<UserControl
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:viewModels="clr-namespace:NevermissClient.ViewModels"
     xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
     mc:Ignorable="d"
     x:Class="NevermissClient.Views.TvshowGridView"
     d:DesignWidth="640" d:DesignHeight="480">

    <Grid x:Name="LayoutRoot">

        <telerik:RadGridView x:Name="TvshowGrid" d:LayoutOverrides="Width, Height" AutoGenerateColumns="False"  ItemsSource="{Binding AllEpisodes}" IsReadOnly="False">
            <telerik:RadGridView.Columns>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding TvshowName, Mode=TwoWay}" Header="Tvshow Name" IsReadOnly="False"/>
                <telerik:GridViewDataColumn DataMemberBinding="{Binding Name, Mode=TwoWay}" Header="Episode Name"/>

                <telerik:GridViewDataColumn DataMemberBinding="{Binding Airdate, Mode=TwoWay}" Header="Airdate"/>
            </telerik:RadGridView.Columns>
        </telerik:RadGridView>

    </Grid>
</UserControl>

The view model, TvshowGridViewModel, that I wish to bind to the TvshowGridView has a constructor that takes arguments.

public class TvshowGridViewModel : BaseViewModel
{
    private EpisodeRepository _episodeRepository;
    private TvshowRepository _tvshowRepository;

    public ObservableCollection<EpisodeViewModel> AllEpisodes { get; private set; }

    public TvshowGridViewModel(EpisodeRepository episodeRepository, TvshowRepository tvshowRepository)
    {
        _episodeRepository = episodeRepository;
        _tvshowRepository = tvshowRepository;

        CreateAllEpisodes();
    }
    ...
}

These arguments are defined in MainWindowViewModel, the view model connected to the MainWindow. - So this seems like the logical place to create the TvshowGridViewModel.

public class MainWindowViewModel : BaseViewModel
{
    readonly TvshowGridViewModel _tvshowGridViewModel;
    readonly EpisodeRepository _episodeRepository;
    readonly TvshowRepository _tvshowRepository;

    public MainWindowViewModel()
    {
        _episodeRepository = new EpisodeRepository("c:\data.xml");
        _tvshowRepository = new TvshowRepository("c:\data.xml");

        _tvshowGridViewModel = new TvshowGridViewModel(_episodeRepository, _tvshowRepository);
    }

    public TvshowGridViewModel TvshowGridViewModel { get; }
    ...
}

How can I bind the instantiated TvshowGridViewModel to the TvshowGridView? (Avoiding codebehind)

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

握住你手 2024-10-13 03:16:58

假设您的 MainWindows Datacontext 是 MainWindowViewModel 的实例,您可以将用户控件绑定到 TvshowGridViewModel,如下所示:

<Window>
... 
<Grid x:Name="LayoutRoot">
    <views:TvshowGridView DataContext={Binding TvshowGridViewModel} x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/>
</Grid>

您还应该更改 TvshowGridViewModel 属性代码,如下所示:

public TvshowGridViewModel TvshowGridViewModel 
{ get{return _tvshowGridViewModel;} }

Assuming that your MainWindows Datacontext is an instance of MainWindowViewModel, you can bind the usercontrol to TvshowGridViewModel like this:

<Window>
... 
<Grid x:Name="LayoutRoot">
    <views:TvshowGridView DataContext={Binding TvshowGridViewModel} x:Name="TheTvshowGridView" Margin="8,8,8,58.96" Grid.Row="1"/>
</Grid>

You also should change the TvshowGridViewModel property code like shown:

public TvshowGridViewModel TvshowGridViewModel 
{ get{return _tvshowGridViewModel;} }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文