【问题标题】:Bind a Timespan to a Slider将时间跨度绑定到滑块
【发布时间】:2014-01-29 14:06:26
【问题描述】:

我的程序中有一个间隔保存为TimeSpan。我想将值绑定到 Slider 以轻松调整 TimeSpan。我的计划是这样的,但它不起作用(它什么都不做):

编辑:根据答案更改了一些代码,但我仍然遇到同样的问题

public partial class MainWindow : Window, INotifyPropertyChanged
{

    ...

TimeSpan measure_gap = TimeSpan.FromSeconds(1); //init
public double Measure_gap 
{
    get
    {
        return measure_gap.TotalSeconds;
    }
    set
    {
        if (value != measure_gap.TotalSeconds)
        {
            measure_gap = TimeSpan.FromSeconds(value);
            OnPropertyChanged("Measure_gap");
        }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

这是我的绑定(我认为问题就在这里)

<Slider HorizontalAlignment="Left" Height="25" Margin="38,202,0,0" 
 VerticalAlignment="Top" Width="217" Minimum="1" Maximum="10" SmallChange="1" 
 Value="{Binding ElementName=MainWindow, Path=Measure_gap, Mode=TwoWay}"/>

所以我的问题是,我做错了什么:-) 谢谢 编辑:this..BindingContext = this

【问题讨论】:

  • 您基本上永远不会告诉 UI 您的值已更改。谷歌INotifyPropertyChanged。在这种情况下,我个人会选择使用DependencyProperty

标签: c# wpf data-binding slider


【解决方案1】:

是的,问题是更改的值不会更新为绑定。这里我稍微阐述一下,

public partial class MainWindow : Window, INotifyPropertyChanged
{

    TimeSpan measure_gap = TimeSpan.FromSeconds(1); //init
    public double Measure_gap
    {
        get
        {
            return measure_gap.TotalSeconds;
        }
        set
        {
            if (value != measure_gap.TotalSeconds)
            {
                measure_gap = TimeSpan.FromSeconds(value);
                OnPropertyChanged("Measure_gap");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if(PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

【讨论】:

  • 欢迎...希望这些内容对您的未来有所帮助..尽管如果您认为此答案会有所帮助..将其标记为答案...谢谢..
  • 因为我没有找到单一(公认的)解决方案如何将变量绑定到 wpf 元素,这似乎是一个更大的问题,然后我想我不能给你一个可接受的答案,因为我的问题是t 还没有解决,但是你当然会因为引导我朝着正确的方向而投赞成票(我希望),我只是决定尝试使用依赖属性而不是放弃 :-) 最后一次尝试!
【解决方案2】:

这里有一个小型、功能齐全的示例供您参考。 Slider 是 TwoWay 数据绑定到 MeasureGap 属性。 TextBlock 与 Slider 绑定,因此您可以在拖动时看到当前值。

XAML

<Window x:Class="SliderExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="120" Width="300">  

    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <TextBlock>
                <Run Text="Current value:" />
                <Run Text="{Binding ElementName=MySlider, Path=Value}" />
            </TextBlock>
        </StackPanel>

        <Slider x:Name="MySlider" Grid.Row="1" 
                Minimum="1" Maximum="10" SmallChange="0.5" 
                Value="{Binding MeasureGap, Mode=TwoWay}" />
    </Grid>
</Window>

代码隐藏

using System;

namespace SliderExample
{
    public partial class MainWindow
    {
        TimeSpan _measureGap = TimeSpan.FromSeconds(3);

        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

        public double MeasureGap
        {
            get { return _measureGap.TotalSeconds; }
            set { _measureGap = TimeSpan.FromSeconds(value); }
        }
    }
}

屏幕截图

【讨论】:

  • 正是我需要的,非常简单,完美的答案,谢谢
【解决方案3】:

您可以将滑块值绑定到实现 INotifyPropertyChanged(Kevin 在评论中所说的)的模型,或者改为处理 ValueChanged 事件并手动检索新值。

【讨论】:

  • Slider.Value 属性默认绑定TwoWay。这不是他的问题。
  • 确实如此。修正了我的答案。
【解决方案4】:

很难说更新后的代码发生了什么,但请继续尝试,让我知道它是否有效:

保留您在 Sankarann 的回答中所做的,但让我们更改一些 XAML。

在 MainWindow XAML 文件的顶部,您应该定义 Window 并添加以下行:

<Window x:Class="Something.MainWindow"
        ...
        ...
        DataContext="{Binding ReletiveSource={ReletiveSource Self}}">

然后从滑块中的绑定中删除元素名称:

<Slider HorizontalAlignment="Left" Height="25" Margin="38,202,0,0"
        VerticalAlignment="Top" Width="217" Minimum="1" Maximum="10" SmallChange="1"
        Value="{Binding Measure_gap, Mode=TwoWay}"/>

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2019-07-10
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多