使用WPF MVVM访问选项卡项中的用户控件数据网格

qyzbxkaa  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(154)

我非常在学习过程中的WPF/MVVM,我已经扫描了其他职位,但还没有遇到有人做什么,我试图完成。
我有一个名为Comp_Item.xamlUser Control(视图),其中的网格/数据网格各有不同的名称:

<Grid ShowGridLines="False">
        <!-- Sectioning Columns and Rows -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="160"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>

        <!-- Data Connection Section -->
        <Grid Grid.Column="0" Grid.Row="0">
            <TextBlock Style="{StaticResource SectionTitleText_Style}" Margin="5,5,0,0" Text="Connections" />
            <DataGrid Name="connDataGrid" AutoGenerateColumns="False" Margin="3,30,3,3" VerticalScrollBarVisibility="Auto" IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Item" Width="*" />
                    <DataGridTextColumn Header="Output" Width="*" />
                    <DataGridTextColumn Header="Status" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>

        <!-- Discrete Outputs Section -->
        <Grid Grid.Column="0" Grid.Row="1">
            <TextBlock Style="{StaticResource SectionTitleText_Style}" Margin="5,5,0,0" Text="Outputs" />
            <DataGrid Name="outDataGrid" AutoGenerateColumns="False" Margin="3,30,3,3" VerticalScrollBarVisibility="Auto" IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Item" Width="*" />
                    <DataGridTextColumn Header="Output" Width="*" />
                    <DataGridTextColumn Header="Status" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>

        <!-- Discrete Inputs Section -->
        <Grid Grid.Column="1" Grid.RowSpan="2">
            <TextBlock Style="{StaticResource SectionTitleText_Style}" Margin="5,5,0,0" Text="Inputs" />
            <DataGrid Name="inDataGrid" AutoGenerateColumns="False" Margin="3,30,3,3" VerticalScrollBarVisibility="Auto" IsReadOnly="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Item" Width="*" />
                    <DataGridTextColumn Header="Output" Width="*" />
                    <DataGridTextColumn Header="Status" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Grid>

我有另一个User Control(视图),名为Dashboard.xaml-它有一个TabControl,其中包含Comp_Item.xaml的4个选项卡

<Grid Grid.ColumnSpan="4" Grid.Row="4">
                <TabControl Margin="10">
                    <TabItem x:Name="comp1" Header="Computer 1" Style="{StaticResource TubeTabItem_Style}">
                        <view:Comp_Item/>
                    </TabItem>
                    <TabItem x:Name="comp2" Header="Computer 2" Style="{StaticResource TubeTabItem_Style}">
                        <view:Comp_Item/>
                    </TabItem>
                    <TabItem x:Name="comp3" Header="Computer 3" Style="{StaticResource TubeTabItem_Style}">
                        <view:Comp_Item/>
                    </TabItem>
                    <TabItem x:Name="comp4" Header="Computer 4" Style="{StaticResource TubeTabItem_Style}">
                        <view:Comp_Item/>
                    </TabItem>
                </TabControl>
            </Grid>

然后,我有一个名为DashboardVM.csView Model(类),我计划在按下开始按钮时执行一些连接相关的测试,然后将结果插入到适当的数据表中。

namespace TesterApp.ViewModel
{
    class DashboardVM : ViewModelBase
    {
        enum TestItemStatus
        { 
            Reset,
            Queued,
            InProgress,
            Pass,
            Fail
        }
    
        private string _StartButtonText;
        private bool isTestRunning;

        public DashboardVM()
        {
            _pageModel              = new PageModel();
            _StartButtonText        = "Start Test";
            StartButtonCommand      = new RelayCommand(o => StartButtonClick("StartButton"));
        }

        public ICommand StartButtonCommand { get; set; }

        private bool TestRunning
        {
            get { return isTestRunning; }
            set { isTestRunning = value;
                  if (isTestRunning) { StartButtonText = "Stop Test"; } 
                  else { StartButtonText = "Start Test";}
                  NotifyPropertyChanged("TestRunning"); 
                }
        }

        private void StartButtonClick(object sender)
        {
            if(TestRunning)
            {
                TestRunning = false;
            }
            else
            {
                // Start program. 
                TestRunning = true;
            }
        }
    }
}

下面是一个图像视图:

我在这里的目标是,假设我用ping测试计算机1的以太网,我希望能够将结果插入到表中。理论上类似于comp1.connDataGrid.Items.Add({"Ethernet", "8 Bytes", "Pass"});-显然我知道这行不通,但希望它能提供一个我希望能够做到的示例。是否有一种方法可以绑定数据以成功完成此操作?

2nbm6dog

2nbm6dog1#

不建议使用Parent作为子节点之间的通信(至少在我们讨论MVVM时)。我建议在这些情况下使用某种messenger。例如,如果您正在使用MVVM,使用一些第三方库(如https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/messenger)或自己编写messenger(您所需要的只是订阅、发布和接收消息)是个不错的主意。
另一个选项是使用全局命令或Service进行跨ViewModel通信。

相关问题