Ham*_*ara 2 wpf binding slider mvvm
我在 MVVM 中的滑块值数据绑定中遇到问题。当价值改变时,我的预期价值没有达到。我该如何解决我的问题?
我有一个列表框、一个滑块和一个文本块。listbox 绑定到 ListImage,滑块值和 textblock 文本绑定到 CurrentImage。一个带有命令的按钮导航 lisbox 项目。CurrentImage 是视图模型中的一个属性。当我更改滑块的设置器时,设置器的新值将设置为滑块设置器的当前值,并且列表框的排列被破坏。例如,当我的滑块设置器的值设置为 50 并且我再次将滑块的值更改为 10 时。我的滑块值从 10 导航到 50,而不是更多。它必须导航整个列表框,但不能。有我的代码:
XAML:
<TextBlock Text="{Binding CurrentImage.Index}"/>
<Slider Height="23" HorizontalAlignment="Left" Margin="12,305,0,0" Name="slider1" VerticalAlignment="Top" Width="479" Maximum="{Binding ListImage.Count, Mode=OneTime}"
Value="{Binding CurrentImage.Index, Mode=TwoWay}"
SmallChange="1" />
<Button Content="{Binding DisplayPlay}" Command="{Binding PlayCommand}" Height="23" HorizontalAlignment="Left" Margin="507,305,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
<ListBox Height="129" HorizontalAlignment="Left" Margin="12,334,0,0" ItemsSource="{Binding ListImage}" SelectedItem="{Binding CurrentImage,Mode=TwoWay}"
VerticalAlignment="Top" Width="472">
Run Code Online (Sandbox Code Playgroud)
视图模型:
public class MainViewModel : ViewModelBase
{
public ICommand PlayCommand { get; set; }
private DispatcherTimer _Timer;
public ImageDTO Image { get; set;}
DataAccess AC = new DataAccess();
public byte[] Bytes { get; set; }
public MainViewModel()
{
ListImage = AC.OpenImages();
CurrentImage = ListImage[0];
Bytes = CurrentImage.Bytes;
this.PlayCommand = new DelegateCommand(Play, CanPlay);
DisplayPlay = "Play";
_Timer = new DispatcherTimer();
_Timer.Interval = new TimeSpan(0, 0, 0, 0, 2000 / 30);
_Timer.Tick += new EventHandler(timer_Tick);
}
private string _DisplayPlay;
public string DisplayPlay
{
get { return _DisplayPlay; }
set
{
if (_DisplayPlay != value)
{
_DisplayPlay = value;
OnPropertyChanged("DisplayPlay");
}
}
}
private List<ImageDTO> _ListImage;
public List<ImageDTO> ListImage
{
get { return _ListImage; }
set
{
if (_ListImage != value)
_ListImage = value;
OnPropertyChanged("ListImage");
}
}
private ImageDTO _CurrentImage;
public ImageDTO CurrentImage
{
get { return _CurrentImage; }
set
{
if (_CurrentImage != value)
{
_CurrentImage = value;
OnPropertyChanged("CurrentImage");
}
}
}
public bool CanPlay(object parameter)
{
return true;
}
public void Play(object parameter)
{
if (DisplayPlay == "Play")
{
DisplayPlay = "Pause";
_Timer.Start();
}
else
{
_Timer.Stop();
DisplayPlay = "Play";
}
}
private void timer_Tick(object sender, EventArgs e)
{
int position = ListImage.FindIndex(x => x.Index == CurrentImage.Index);
position++;
if (position == ListImage.Count)
{
position = 0;
}
else
{
CurrentImage = ListImage[position];
}
}
Run Code Online (Sandbox Code Playgroud)
也许这就是你想要的:
<StackPanel>
<ListBox x:Name="ImageListBox" IsSynchronizedWithCurrentItem="True">
<ListBoxItem>Image1</ListBoxItem>
<ListBoxItem>Image2</ListBoxItem>
<ListBoxItem>Image3</ListBoxItem>
<ListBoxItem>Image4</ListBoxItem>
</ListBox>
<Slider Value="{Binding ElementName=ImageListBox, Path=SelectedIndex}"
Maximum="{Binding ElementName=ImageListBox, Path=Items.Count}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
您可能希望比在此示例中更好地处理最大值
归档时间: |
|
查看次数: |
9869 次 |
最近记录: |