【问题标题】:Is it a good idea to bind SelectedItem of a tab control with MVVM?将选项卡控件的 SelectedItem 与 MVVM 绑定是个好主意吗?
【发布时间】:2019-11-11 17:46:33
【问题描述】:

我想知道在选项卡控件中选择了哪个选项卡。我正在使用 MVVM。

我知道我可以绑定选项卡控件的SelectedIndex,但我也可以绑定selectedItem,它是一个TabItem对象。

我读到视图模型不应该知道视图,并且很多时候读到这意味着不使用属于视图的类型的对象。所以在这种情况下,TabItem 是一个属于视图空间的对象,所以我想知道绑定到 SelectedItem 是否是个好主意。

但是,建议不要绑定属于视图的类型,我理解的不仅仅是视图模型不应该依赖于视图的结构或行为来分离这两个部分。但是,从某种角度来看,TabItem 只是一个对象,我以隔离的方式使用它(我没有将视图模型与视图对齐)。我将 tabItem 用作任何其他对象。

所以我的问题是,在 MVVM 中,在我的视图模型中使用 TabItem 真的是个坏主意吗?

编辑:我添加标签控件的代码:

                        <TabControl HorizontalAlignment="Stretch" Margin="5,5,5,5" Grid.Column="0" Grid.Row="1" VerticalAlignment="Stretch" Grid.ColumnSpan="2">
                            <TabItem Header="Persons" Content="{Binding Persons}"/>
                            <TabItem Header="Cities" Content="{Binding Cities}"/>

我有一个用于人员的用户控件和用于城市的其他用户控件。

【问题讨论】:

  • 当您手动编写不同的&lt;TabItem&gt;s 时:是的,这是个坏主意。绑定 SelectedIndex 不会很好,但在这种情况下可以使用。仅当您还将 ItemsSource 绑定到某些东西时,绑定 Selecteditem 才有意义,请参阅@d.moncada 的答案。
  • 那么{Binding Persons} 是如何产生 UserControl 的呢?

标签: c# wpf mvvm


【解决方案1】:

是的,SelectedItem 绝对是个好主意。在 TabControl 上,SelectedItem 将绑定到 TabControls 数据源的数据类型。

例子:

<TabControl x:Name="TabControl1"
                    Margin="10"
                    ItemsSource="{Binding Employees}"
                    SelectedItem="{Binding SelectedEmployee}">
</TabControl>

public class ViewModel
{
    private Employee _selectedEmployee;

    public IList<Employee> Employees { get; private set; }

    public Employee SelectedEmployee
    {
        get { return _selectedEmployee; }
        set
        {
            if (_selectedEmployee == value)
            {
                return;
            }

            _selectedEmployee = value;
            OnNotifyPropertyChanged();
        }
    }
}

ViewModel 对 UI 数据类型一无所知,它只知道底层数据(SelectedEmployee)。

见:https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc672537(v%3Dvs.95)

【讨论】:

  • 一个正确但不完整的答案。您应该添加 DataTemplate 以将 TabItem 与 EmployeeView 挂钩。
  • @HenkHolterman,我认为他已经设置了该信息。我也可以添加
  • 真的,我控件中的每个选项卡都是不同的类型,所以如果你能给出更详细的例子,我会非常感谢你。因为我不知道 Employee 是视图还是视图模型。感谢您的帮助。
  • @ÁlvaroGarcía Employee 是 ViewModel。如果每个选项卡都是不同的类型,您的 DataSource 会是什么样子?除非,你有硬编码的标签?发布您的 XAML
  • 我的意思是 tabitem 有用户控制人员,而其他 tabitem 有用户控制城市。它们是不同的视图和不同的视图模型。
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多