在按钮上单击我想将按钮文本发送到viewModel(MVVM)

时间:2019-10-03 08:12:45

标签: c# wpf

MVVM:我有一个嵌套的按钮,单击该按钮时可以从中提取文本。

如您所知,如果嵌套按钮,则无法在其后的代码中调用该按钮, 因此,基本上我想单击此嵌套按钮,然后从XAML将该按钮的文本发送到我的viewModel。

我已经搜索了几天,但似乎仍然无法获得足够好的答案

我尝试过绑定-两个并更新源,但是我不知道这是否是正确的方法

                                                  

                    <ItemsControl ItemsSource="{Binding Items}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate x:Name="dataTemp">

                                <!-- Declaring a button-->
                                <Button x:Name="btnItem" d:DataContext="{x:Static local:ItemDesign.Instance}" 
                                        Background="White" Height="60" Width="300">

                                    <!--Content Grid (Main) -->
                                    <Grid x:Name="container" Height="60" Width="300">
                                        <Grid.ColumnDefinitions>
                                            <!--Colour circle-->
                                            <ColumnDefinition Width="Auto"/>
                                            <!--Full Name-->
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>

                                        <!--Colour Circle-->
                                        <Border Grid.Column="0" Padding="6">
                                            <Border Background="#FF1869B6" 
                                                    Width="{Binding ActualHeight, RelativeSource={RelativeSource self}}"
                                                    CornerRadius="25">
                                                <TextBlock  x:Name="txtInitials" Text="{Binding Initials, Mode=TwoWay}"
                                                            VerticalAlignment="Center" 
                                                            HorizontalAlignment="Center"
                                                            Foreground="White" FontSize="25" FontFamily="Segoe UI Semilight"/>
                                            </Border>
                                        </Border>
                                        <!-- EO Colour Circle-->

                                        <!-- Full Name Textblock-->
                                        <TextBlock  x:Name="txtFullName"
                                                    Text="{Binding FullName, Mode=TwoWay}"
                                                    Grid.Column="2"
                                                    Padding="15 0 0 0"
                                                    VerticalAlignment="Center"
                                                    Foreground="#FF1869B6"
                                                    TextTrimming="CharacterEllipsis"                                  
                                                    FontSize="25"/>
                                        <!-- EO Full Name Textblock-->

                                    </Grid>

                                    <!-- Button Styling -->
                                    <Button.Style>
                                        <Style TargetType="{x:Type Button}">
                                            <Setter Property="BorderBrush" Value="White"/>
                                            <Setter Property="BorderThickness" Value="0"/>
                                            <Style.Triggers>
                                                <Trigger Property="IsPressed" Value="true">
                                                    <Setter Property="BorderThickness" Value="2"/>
                                                </Trigger>

                                                <DataTrigger Binding="{Binding ElementName=btnItem, Path=IsPressed}" Value="true">

                                                    <!--
                                                    <Setter Property="Button" Value="{Binding FullName, Mode=OneWayToSource}"/>
                                                    -->
                                                    <Setter Property="Foreground" Value="Black"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </Button.Style>
                                    <!-- EO Button Styling -->

                                </Button>
                                <!-- EO Declaring a button-->

                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>

                </ScrollViewer>
            </Grid>
        </ScrollViewer>
        <!-- EO Patient List -->

1 个答案:

答案 0 :(得分:0)

有多种方法可以使用纯MVVM来完成您想要的工作,但是我将以一种方式回答它,让您将逻辑分解为适合您的一切。

此示例的目的是将Content的{​​{1}}传递给ViewModel并将其显示在主Button上的TextBlock中。这是在MVVM中完成的,并且在后面不使用任何代码。

首先,有一个主窗口带有我认为您需要(或类似)的XAML,下面是使该示例在MVVM上运行的所有代码。 在此示例中,我通过命令中的参数将Window的{​​{1}}传递回来。注意:按钮的Content不必是,在许多情况下也可以不是文本。我正在将命令中的对象转换为文本,但是您需要确保它在XAML中有效。

Button

道歉,以合并所有代码,但希望为您提供完整的源代码。下面是RelayCommand,ViewModelBase,ExampleViewModel和TestItemViewModel。

Content

enter image description here

enter image description here

enter image description here