Zwei-Wege-Bindung von einem textbox bis einen Schieberegler in WPF

Ich bin habend die härteste Zeit herauszufinden, ein Weg, ein problem zu lösen, ich habe mit databinding auf einen Schieberegler und ein Textfeld.

Das setup:
der aktuelle Wert des Reglers angezeigt wird innerhalb der textbox. Wenn der Benutzer den Schieberegler kann der Wert spiegelt sich im inneren der textbox. Der Benutzer kann wählen, um den Schieberegler ziehen und loslassen, um den Wert er wählt, klicken Sie irgendwo auf die Schiebereglerleiste, um den Wert oder den Wert manuell eintragen in die texbox. Im letzten Fall wird der eingegebene Wert in der textbox sollten das update auf die position des Reglers.

Die texbox ist zwei-Wege-gebunden an ein datacontext-Eigenschaft während der Schieberegler ist einer Art und Weise gebunden, um die gleiche Eigenschaft. Wenn der Benutzer die Folien, oder klicken Sie auf den Schieberegler tracker, ich benutze die dragcompleted-Ereignis der slider zu informieren und den datacontext der änderung. Wenn der Benutzer klickt auf den tracker auf der anderen Seite nutze ich die OnValueChanged-Ereignis der slider zu informieren und den datacontext (und verwenden Sie eine Flagge, um sicherzustellen, die OnValueChanged wurde nicht ausgelöst durch einen Schieberegler bewegen)

Das problem: Die OnValueChanged Ereignis feuert auch beim initialisieren der Wert des Schiebereglers mit der verbindlichen Wert, so kann ich nicht herausfinden, ob der Wert tatsächlich aus der Benutzer-oder der Bindung.

Könnten Sie bitte vorschlagen, vielleicht und alternativen Weg, um die Bindung zu gewährleisten, können wir unterscheiden zwischen Anwender-update und binding-udpates für den regler?
Thnak Sie!

UPDATE Sorry, ich vergaß zu erwähnen, warum ich mich nicht binden direkt beide Schieberegler und Textfeld zwei Möglichkeiten, wie die unten Antworten vorschlagen. Die Aktualisierung der Daten Kontext-Wert auslösen sollen, einen Anruf zu einem backend-server und das abrufen von Daten aus einer Datenbank. Das problem ist, dass, wenn der Benutzer den Schieberegler, die Sie ständig feuert updates. Ich gehe um das problem, indem Sie nur unter Berufung auf die tatsächliche onValueChanged-Ereignis aufrufen, die DoWhatever Methode. Ich hoffe das ist etwas klarer. Sorry für das weglassen dieser...

Ich schnell zusammen, im folgenden Beispiel für Sie, es zu versuchen.

Die xaml -:

<Window x:Class="SliderIssue.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid HorizontalAlignment="Center"
      VerticalAlignment="Center">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <Slider Name="slider" VerticalAlignment="Top"  
            ValueChanged="slider_ValueChanged"
            Thumb.DragStarted="slider_DragStarted"
            Thumb.DragCompleted="slider_DragCompleted"
            Value="{Binding Count}"
            Width="200"
            Minimum="0"
            Maximum="100"/>
    <TextBox VerticalAlignment="Top" 
             HorizontalAlignment="Left"
             Grid.Column="1" 
             Width="100" 
             Text="{Binding Count,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" 
             Height="25"/>    
</Grid>

Der code hinter:

using System.Windows;

namespace SliderIssue
{
    ///<summary>
    ///Interaction logic for MainWindow.xaml
    ///</summary>
    public partial class MainWindow : Window
    {
        private bool _dragStarted;

        public MainWindow()
        {
            InitializeComponent();

            var item = new Item();
            DataContext = item;
        }

        private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (!_dragStarted)
            {
                var item = (Item)DataContext;
                item.DoWhatever(e.NewValue);
            }
        }

        private void slider_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
        {
            _dragStarted = true;
        }

        private void slider_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
        {
            _dragStarted = false;

            var item = (Item) DataContext;
            item.DoWhatever(slider.Value);
        }
    }
}

Eine einfache Daten-Klasse:

using System.ComponentModel;

namespace SliderIssue
{
    public class Item : INotifyPropertyChanged
    {
        private int _count = 50;
        public int Count
        {
            get { return _count; }
            set
            {
                if (_count != value)
                {
                    _count = value;
                    DoWhatever(_count);
                    OnPropertyChanged("Count");
                }
            }
        }

        public void DoWhatever(double value)
        {
            //do something with value
            //and blablabla
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
}
Ich bin mir nicht sicher, ich verstehe das problem. Sind Sie einfach versuchen, um den slider zu aktualisieren, wenn ein Benutzer ändert den Wert in der TextBox? Warum brauchen Sie, um diese Ereignisse zu tun?
Ich benutze den Veranstaltungen zu ermöglichen, um die Schieberegler zu unterlassen, die Aktualisierung der datacontext-Wert beim ziehen der tracker, bis der Benutzer freigegeben hat, den regler tracker.

InformationsquelleAutor ak3nat0n | 2012-12-28

Schreibe einen Kommentar