C# 如何知道所选选项卡的名称?(MVVM)

C# 如何知道所选选项卡的名称?(MVVM),c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我有一个控制按钮点击事件的视图模型,代码是: ucMantenimientoView miViewPlanificacion = new ucMantenimientoView(); ucMantenimientoViewModel miViewModelPlanificacion = new ucMantenimientoViewModel(); miViewPlanificacion.DataContext = miViewModelPlanificacion; 视图有一个选项卡,我使用M

我有一个控制按钮点击事件的视图模型,代码是:

ucMantenimientoView miViewPlanificacion = new ucMantenimientoView();
ucMantenimientoViewModel miViewModelPlanificacion = new ucMantenimientoViewModel();
miViewPlanificacion.DataContext = miViewModelPlanificacion;
视图有一个选项卡,我使用MVVM Light管理选项卡控件selectedItem事件视图模型上的click事件

问题是,我需要知道在创建视图和视图模型时所选选项卡的名称,但selectedItem不是fire,默认情况下是在第一个选项卡上选择的,因此我不知道如何在创建视图模型时获取所选选项卡的名称

如果我选择了另一个选项卡,然后又选择了第一个选项卡,那么它就可以工作了,但是我需要在视图模型的构造函数中使用这些数据


谢谢。

当使用WPF和MVVM时,我们想知道UI控件的一些值,通常只需将视图模型属性数据绑定到该UI属性。通过这种方式,我们始终可以在视图模型中找到所需的数据

如何设置
绑定将取决于如何设置XAML。如果像下面的示例那样对
选项卡Control.ItemsSource
进行数据绑定,那么您将拥有
选项卡Item.Header
属性中所有
选项卡ItemData.HeaderText
属性的文本:

<TabControl ItemsSource="{Binding YourTabItemData}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding HeaderText}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <!-- Content -->
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

但是,如果您没有将数据绑定到
TabControl.ItemsSource
属性,那么有一个更简单的解决方案。您可以设置
SelectedValuePath
属性,从所选
TabItem
返回
标题
值,然后将数据绑定到
SelectedValue
属性以获取实际值:

<TabControl SelectedValue="{Binding Selected}" SelectedValuePath="Header">
    <TabItem Header="HeaderOne" Name="NameOne"></TabItem>
    <TabItem Header="HeaderTwo" Name="NameTwo"></TabItem>
</TabControl>

您甚至可以根据您的需要使用这两种解决方案的一部分

免责声明:
当你说
Name
时,我只是假设你指的是
Header
,但是如果你真的指的是
Name
,那么如果你简单地用
Name
替换所有出现的
Header
,这个解决方案也同样有效


当使用WPF和MVVM并且我们想知道UI控件的一些值时,通常只需将视图模型属性数据绑定到该UI属性。通过这种方式,我们始终可以在视图模型中找到所需的数据

如何设置
绑定将取决于如何设置XAML。如果像下面的示例那样对
选项卡Control.ItemsSource
进行数据绑定,那么您将拥有
选项卡Item.Header
属性中所有
选项卡ItemData.HeaderText
属性的文本:

<TabControl ItemsSource="{Binding YourTabItemData}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding HeaderText}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <!-- Content -->
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

但是,如果您没有将数据绑定到
TabControl.ItemsSource
属性,那么有一个更简单的解决方案。您可以设置
SelectedValuePath
属性,从所选
TabItem
返回
标题
值,然后将数据绑定到
SelectedValue
属性以获取实际值:

<TabControl SelectedValue="{Binding Selected}" SelectedValuePath="Header">
    <TabItem Header="HeaderOne" Name="NameOne"></TabItem>
    <TabItem Header="HeaderTwo" Name="NameTwo"></TabItem>
</TabControl>

您甚至可以根据您的需要使用这两种解决方案的一部分

免责声明:
当你说
Name
时,我只是假设你指的是
Header
,但是如果你真的指的是
Name
,那么如果你简单地用
Name
替换所有出现的
Header
,这个解决方案也同样有效


您是否尝试过绑定
TabControl
SelectedItem
属性(假设它有一个)而不是事件,并观察VM中的更改?我使用的是Telerik control suite,它允许您选择一个
SelectEditImpression
,您可以指向绑定对象上的属性-我使用选项卡项的
标记
属性来存储选项卡名称。您还可以绑定
SelectedIndex
属性-可能不太明确,但如果您可以保证选项卡顺序,这是一个选项。如果您无法强制手动触发事件或使用聚合器将数据发送到VMWell,我会在miViewPlanification.MyTabCOntrol.SelectedItem选项中考虑,但视图的属性不可用。而不是事件,您是否尝试过绑定
TabControl
SelectedItem
属性(假设它有一个属性),并查看VM中的更改?我使用的是Telerik control suite,它允许您选择一个
SelectEditImpression
,您可以指向绑定对象上的属性-我使用选项卡项的
标记
属性来存储选项卡名称。您还可以绑定
SelectedIndex
属性-可能不太明确,但如果您可以保证选项卡顺序,这是一个选项。如果您无法强制手动触发事件,或者使用聚合器将数据发送到VMWell,我在MiviewPlanification.MyTabCOntrol.SelectedItem的选项中考虑过,但该视图的属性不可用。是的,我的意思是“name”而不是“header”,但是是一样的,谢谢。哈哈。。。是的,对不起,我刚才在回答一半的时候想到了。是的,我的意思是“名字”而不是“标题”,但是是一样的,谢谢。哈哈。。。是的,对不起,我刚刚在回答一半的时候想到了这一点。