2017-11-13 6 views
-1

WPFにはSliderがあり、同じスライダを2つの異なる値にバインドしたいとします。しかし、これらの値のそれぞれは異なる範囲を持っています。たとえば、最初の値は時間を表し、0〜1.5秒の間で変化し、2番目の値は0〜100の範囲のパーセント値を表します。Sliderの値を両方の値にバインドすることもできます。スライダと他の値の両方が更新されます。たとえば、ユーザーが時刻値を1に設定した場合は、Sliderが移動し、パーセント値も66.66%に設定されます。事前に異なる範囲の異なる2つのテキストボックスにスライダをバインドしました

おかげ

+1

おそらく、カスタム 'MultiValueConverter'で' MultiBinding'を使用しますか? – ASh

+0

['Slider'](https://msdn.microsoft.com/en-us/library/system.windows.controls.slider(v = vs.110).aspx)には、「最小」と「最大」の依存関係がありますプロパティもバインドできます。 – Sinatr

+0

@Sinatrはい、2つの異なる値の 'Maximum'と 'Minimum'は異なります。 – VegaBrothers

答えて

0

あなたのソリューションは、このようなものかもしれません。しかしそのために

MainWindow.xaml

<Window x:Class="WpfApp1.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:wpfApp1="clr-namespace:WpfApp1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     d:DataContext="{d:DesignInstance d:Type=wpfApp1:SampleViewModel}"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <TextBlock Text="0-1.5" Grid.Column="0" Grid.Row="0"/> 
     <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Value1, Mode=TwoWay}"/> 

     <TextBlock Text="0-100" Grid.Column="0" Grid.Row="1"/> 
     <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Value2, Mode=TwoWay}"/> 

     <Slider Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" Height="25" Minimum="0" Maximum="100" Value="{Binding Value2}"/> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using System; 
using System.ComponentModel; 
using System.Linq; 
using System.Runtime.CompilerServices; 

namespace WpfApp1 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataContext = new SampleViewModel(); 
     } 
    } 

    public sealed class SampleViewModel : INotifyPropertyChanged 
    { 
     private double _value1; 
     private double _value2; 

     public event PropertyChangedEventHandler PropertyChanged; 

     public double Value1 
     { 
      get { return _value1; } 
      set 
      { 
       if (_value1 == value) 
        return; 

       _value1 = value; 
       OnPropertyChanged(nameof(Value1)); 
       _value2 = Math.Round(100/1.5 * value, 1); 
       OnPropertyChanged(nameof(Value2)); 
      } 
     } 

     public double Value2 
     { 
      get { return _value2; } 
      set 
      { 
       if (_value2 == value) 
        return; 

       _value2 = value; 
       OnPropertyChanged(nameof(Value2)); 
       _value1 = Math.Round(1.5 /100* value, 1); 
       OnPropertyChanged(nameof(Value1)); 
      } 
     } 
    private void OnPropertyChanged(string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

"よく知られている「最小値/最大値」です。動的なものが必要な場合(コンパイル時に最小/最大を知ることはできません。ハードコーディングされたものを避ける唯一の正しい解決策です)、数学をする必要があります。 また、マルチバインディングを使用して同じ結果を得ることができます。最小/最大と値を渡し、すべての数式を内部で行います。

+0

私はコンパイル時にそれらを計算しています。私が今行っていること(私が好きではない)は、スライダをテキストボックスの1つにバインドし、次にSliderの値を変更してもう一方を手動で更新します。私は、あなたのアプローチがどのように働いているかを報告し、報告するよう努力します。ありがとう。 – VegaBrothers

関連する問題