如何在WPF、VB.NET中根据滑块中的滑块值更改文本框中的文本和标签

如何在WPF、VB.NET中根据滑块中的滑块值更改文本框中的文本和标签,wpf,vb.net,Wpf,Vb.net,世界粮食计划署有一个巨大的问题,我有一个带有数字1,2的滑块。和两个文本框。Textbox1和Textbox2 <TextBox Name="Textbox2"> <TextBox.Style> <Style TargetType="TextBox"> <Style.Triggers> <DataTrigger Binding="{Binding ElementN

世界粮食计划署有一个巨大的问题,我有一个带有数字1,2的滑块。和两个文本框。Textbox1和Textbox2

<TextBox Name="Textbox2">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=TextBox1, Path=Text}" Value="1">
                    <Setter Property="Text" Value="Slow"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=TextBox1, Path=Text}" Value="2">
                    <Setter Property="Text" Value="Fast"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
所以,当我开始时,我在移动之前先从滑块上的1开始,这正是我需要的,当我在2上移动滑块时,值“2”显示在Textbox1中,因为我在textbox和滑块值之间使用了绑定。 然后我就这样做了 TexChanged Sub

Private Sub TextBox1_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextBox1.TextChanged

    If TextBox1.Text = "2" Then
        TextBox2.Text = "FAST"
    End If
End Sub
这是可行的,问题是当我想向后移动滑块,并将值“1”转换为“慢”。它会阻止你做任何事,并以任何可能的方式尝试。它永远不允许使用滑块的起始值。您不能使用值“1”执行任何操作

我希望这能奏效

Private Sub TextBox1_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextBox1.TextChanged

    If TextBox1.Text = "2" Then
        TextBox2.Text = "FAST"
    End If
    If TextBox1.Text = "1" Then
        TextBox2.Text = "SLOW"
    EndIf
End Sub

当然,当我把它放在点击按钮下时,一切都很好。当我把它也放在slidermove下时,它也不起作用。请帮忙

首选的方法是在Textbox2中使用一对触发器

<TextBox Name="Textbox2">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=TextBox1, Path=Text}" Value="1">
                    <Setter Property="Text" Value="Slow"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=TextBox1, Path=Text}" Value="2">
                    <Setter Property="Text" Value="Fast"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>


注意:我刚刚注意到,在您的原始示例中(编辑之前),第二个if缺失,而end if缺失。这可能是您的问题。

正如您所提到的这句话,“那么值“2”显示在Textbox1中,因为我在textbox和slider的值之间使用了绑定”

最简单的方法是更新TextBox1ViewModel setter方法上的TextBox2ViewModel属性,如下所示

Private _textBox1Value As String

Public Property TextBox1Value As String
    Get
        Return _textBox1Value
    End Get
    Set(ByVal value As String)
        _textBox1Value = value
        SetTextBox2Value(value)
        OnPropertyChanged("TextBox1Value")
    End Set
End Property

Private _textBox2Value As String
Public Property TextBox2Value As String

Private Sub SetTextBox2Value(ByVal value As String)
End Sub
假设您有一个绑定到ViewModel属性的textbox2,如果没有,现在就可以绑定它

注意:-另一个答案(见我的帖子后)也有道理,但如果你想有一些额外的逻辑,如果你的滑块点增加到更多的数字,如果你想有不同的文本值为每个滑块位置,那么viewmodel方法是好的,到目前为止,我觉得。如果需要,还可以对viewmodel进行单元测试


希望它能帮助你:)

@Neil B有答案,但更简单

<TextBox Text="{Binding Path=Value, ElementName=sldValue}"/>
<Slider x:Name="sldValue"/>


在“SetTextBox2Value”方法中,使用switch或任何其他条件语句编写逻辑。谢谢您的尝试。我尝试过了,但OnPropertyChanged()上出现错误,_textBox2Value上出现冲突,将尝试按您的方式工作,并将我的答案进行分组,因为我的事件处理程序有“[CallerMemberName]”所以在我的例子中,它不需要传递参数。很抱歉给你带来了困惑。第二个问题是冲突,因为viewmodel中可能有其他同名属性。检查副本,然后再试一次。非常感谢。我会再试一次。谢谢,它工作得非常好,只是我必须将第一行更改为“确定”。如果您找到了解决方案,请不要忘记选择答案。