我有一个WPF项目,我在ListBox中使用ProgressBars来显示一系列值。我想在位于进度条正上方的文本框中显示数值。如何获取每个进度条的值的位置,以便我可以放置一个TextBox? 这是ProgressBar xaml:
<ProgressBar Orientation="Vertical"
Width="78"
BorderThickness="0"
Minimum="{Binding minTest}"
Maximum="{Binding maxTest}"
Value="{Binding valTest}"
Background="Transparent"
Foreground="{Binding bar_color}"/>
答案 0 :(得分:2)
有几种方法可以做到这一点。一个可能是:
<Window x:Class="SO41749207.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SO41749207"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding ElementName=MyProgress, Path=Value}" />
<ProgressBar Name="MyProgress" Value="50" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ListBox>
<ListBoxItem>a</ListBoxItem>
<ListBoxItem>b</ListBoxItem>
<ListBoxItem>c</ListBoxItem>
</ListBox>
</Grid>
</Window>
更类似MVVM的方法是为列表项定义视图模型:
public class MyListItem : INotifyPropertyChanged
{
double m_progressValue = 0.0;
public double ProgressValue
{
get { return m_progressValue; }
set
{
m_progressValue = value;
OnPropertyChanged("ProgressValue");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
...和相应的DataTemplate:
<DataTemplate DataType="{x:Type models:MyListItem}">
<StackPanel Orientation="Vertical">
<TextBox Text="{Binding ProgressValue}" HorizontalAlignment="Center" Width="50" TextAlignment="Center" />
<ProgressBar Value="{Binding ProgressValue}" />
</StackPanel>
</DataTemplate>
...对于列表项:
<ListBox HorizontalContentAlignment="Stretch">
<ListBox.ItemsSource>
<cols:ArrayList>
<models:MyListItem ProgressValue="10" />
<models:MyListItem ProgressValue="50" />
<models:MyListItem ProgressValue="80" />
</cols:ArrayList>
</ListBox.ItemsSource>
</ListBox>
答案 1 :(得分:0)
由于您已将ProgressBar值绑定到viewmodel:
<ProgressBar Orientation="Vertical"
Width="78"
BorderThickness="0"
Minimum="{Binding minTest}"
Maximum="{Binding maxTest}"
Value="{Binding valTest}"
Background="Transparent"
Foreground="{Binding bar_color}"/>
为什么不将TextBox绑定到相同的值?
<TextBox Text="{Binding valTest}" />