双边绑定 textbox 滑块B. WPF
我可以找到解决问题的方法更困难,这些问题与我的数据绑定到滑块和 textbox.
环境
:
滑块的当前值显示在内部 textbox. 当用户拖动滑块时,值在内部反映出来 textbox. 用户可以拖动滑块并将其释放到所选值,单击跟踪路径中的任意位置以设置值,或者手动输入文本框中的值。 在后一种情况下,在现场输入的值 textbox, 必须更新滑块的位置。
Texbox 双边附属于财产 datacontext, 滑块单侧绑定到同一属性。 当用户幻灯片或点击滑块跟踪器时,我使用该事件 dragcompleted 滑块通知 datacontext 关于改变。 另一方面,当用户点击跟踪器时,我使用一个事件 OnValueChanged 滑块通知 datacontext /并使用该标志确保 OnValueChanged 不是由移动滑块造成的/
问题
: 事件 OnValueChanged 即使使用绑定值初始化滑块值,所以我无法理解此值是否真正来自用户或绑定。
您是否可以建议,也许是替代方法,以确保我们可以区分用户更新和绑定 udpates 对于滑块?
Thnak 你!
更新
对不起,我忘了提到为什么我不直接相交 slider, 所以我。 textbox 有两种方式,正如暗示下面的答案。 假设数据上下文值的更新将调用内部服务器并从数据库中检索数据。 问题是,当用户拖动滑块时,它不断启动升级。 我不会失去问题,只依赖实际的事件。 onValueChanged 调用方法 DoWhatever. 我希望它有点清晰。 对不起,我把它放下......
我很快收集了下面的样本,这样你就可以尝试。
在 xaml
:
对于代码
:
简单的数据类
:
</double></window>
环境
:
滑块的当前值显示在内部 textbox. 当用户拖动滑块时,值在内部反映出来 textbox. 用户可以拖动滑块并将其释放到所选值,单击跟踪路径中的任意位置以设置值,或者手动输入文本框中的值。 在后一种情况下,在现场输入的值 textbox, 必须更新滑块的位置。
Texbox 双边附属于财产 datacontext, 滑块单侧绑定到同一属性。 当用户幻灯片或点击滑块跟踪器时,我使用该事件 dragcompleted 滑块通知 datacontext 关于改变。 另一方面,当用户点击跟踪器时,我使用一个事件 OnValueChanged 滑块通知 datacontext /并使用该标志确保 OnValueChanged 不是由移动滑块造成的/
问题
: 事件 OnValueChanged 即使使用绑定值初始化滑块值,所以我无法理解此值是否真正来自用户或绑定。
您是否可以建议,也许是替代方法,以确保我们可以区分用户更新和绑定 udpates 对于滑块?
Thnak 你!
更新
对不起,我忘了提到为什么我不直接相交 slider, 所以我。 textbox 有两种方式,正如暗示下面的答案。 假设数据上下文值的更新将调用内部服务器并从数据库中检索数据。 问题是,当用户拖动滑块时,它不断启动升级。 我不会失去问题,只依赖实际的事件。 onValueChanged 调用方法 DoWhatever. 我希望它有点清晰。 对不起,我把它放下......
我很快收集了下面的样本,这样你就可以尝试。
在 xaml
:
<window height="350" title="MainWindow" width="525" x:class="SliderIssue.MainWindow" xmlns="[url=http://schemas.microsoft.com/winfx/2006/xaml/presentation"]http://schemas.microsoft.com/w ... ot%3B[/url] xmlns:x="[url=http://schemas.microsoft.com/winfx/2006/xaml">]http://schemas.microsoft.com/w ... gt%3B[/url]
<grid horizontalalignment="Center" verticalalignment="Center">
<grid.columndefinitions>
<columndefinition></columndefinition>
<columndefinition></columndefinition>
</grid.columndefinitions>
<slider maximum="100" minimum="0" name="slider" thumb.dragcompleted="slider_DragCompleted" thumb.dragstarted="slider_DragStarted" value="{Binding Count}" valuechanged="slider_ValueChanged" verticalalignment="Top" width="200"></slider>
<textbox grid.column="1" height="25" horizontalalignment="Left" text="{Binding Count,Mode=TwoWay,UpdateSourceTrigger=LostFocus}" verticalalignment="Top" width="100"></textbox>
</grid>
对于代码
:
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/;
}
}
}
简单的数据类
:
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//;
}
}
}
}
</double></window>
没有找到相关结果
已邀请:
2 个回复
莫问
赞同来自:
大约与埃里克一样,但作为操作的单独提议。
捆绑两个元素,以便他们被认为是双边的,正如我在下面所建议的那样。
通过检查两个变量来创建每个第二种变量的计时器。
/Timer Check #1/ 检查是否执行了数据库请求 /例如,逻辑标志/. 如果这是真的,那么她什么都不做。 如果没有操作 /false/, 他搬到了一步 4.
/检查计时器 #2/ 他检查计数器是否发生了变化。 如果一个 count 更改,它设置了当前的数据请求标志 /找到/用于追逐 3/, 启动异步数据库调用并完成工作。
/调用数据库操作/ 适当地接收数据库数据和更新 VM. 它将当前数据查询标志设置为 false, 如果计数器更改,则允许您检查计时器以启动新请求。
因此,即使用户从滑块发出疯狂,您也可以管理更新。
我认为你可能会想到它。 从滑块中删除所有事件 textbox. 如果是第一个值 /指定的软件/ 不应该打电话给你的方法 DoWhatever, 在此代码中勾选勾选跳过第一个初始化....
我建议你制作一个滑块绑定 Count 作为制度 TwoWay 并制作一个财产 Count 执行您需要的另一个过程 /如您实体类所示/. 无需检查点击或任何其他事件的存在。 如果用户更改值 textbox, 它更改了滑块,反之亦然。
知食
赞同来自:
39, 现在我理解为什么你试图完全这样做。 我有几个可以提供帮助的建议。
我的第一个是更自信的,但我不可能提供它。 如果您尝试决定的问题是将请求缩小到内部数据库,我会说出你的 ViewModel 不应该担心它。 我会将其递下来将基于从发送的更新值调用服务器部件的对象中的图层 ViewModel.
你可以创造一个尝试扼杀穷人,录音
每次呼叫都用于后端请求。 DB. 将此值与最新录制的值进行比较。 如果是价值 TimeSpan between 低于您的最小阈值,更新将其进行比较和忽略请求的值。
您可以通过计时器执行此操作并每次进行请求时转储定时器,但它更加令人困惑。
从服务器部分返回呼叫时,此级别会导致进程的事件 ViewModel 并确实他需要与返回数据做的一切。
作为另外一个优惠,我还会检查什么给你 ReactiveExtensions. 理解他们的工作需要一段时间,但你可以创造
从事件的流程,然后使用该方法
, 返回另一个
. 你订阅了这个
并在那里执行你的电话。 它需要更重新重新思考软件的设计和架构,但它有趣。
保罗·贝茨创造了一个整体结构 MVVM, 基于 Rx 题为
http://www.reactiveui.net
. 我首先了解到他在其中一个博客帖子中观察到的人
http://blog.paulbetts.org/inde ... lper/
.
祝你好运!
原始帖子
如果我理解你的问题正确,它听起来好像想要滑块,而且 TextBox 反映了同样的财产 DataContext /通常这一点 ViewModel/. 看起来你正在尝试复制什么给你一个绑定机制 WPF. 我设法快速获取了这项工作的原型。 这是我使用的代码。
要表示,我只需创建一个新窗口,将其作为窗口的内容。
请注意滑块和 TextBox 绑在一起 /巧妙地打电话/ 意义 DataContext. 当用户输入新值时 TextBox, 该价值将改变并通知财产的变更 /在 ViewModel/ 调用滑块自动更新您的值。
这是代码 ViewModel /IE DataContext 表示/.
My ViewModel 来自课程 ViewModelBase, 它实现了界面
. 方法
在基类中确定,它仅导致名称被发送为参数的属性的事件。
最后,我创建了一个想法并指定了一个新的副本。 ViewModel 就像它一样 DataContext /我直接在方法中完成了它
此示例的应用程序/.
我希望这将有助于您朝着正确的方向移动。