gpt4 book ai didi

silverlight - 如何在双向绑定(bind)中传递来自源的更改?

转载 作者:行者123 更新时间:2023-12-03 10:40:02 25 4
gpt4 key购买 nike

我创建了一个包含依赖属性“Text”的自定义 TextBox 控件(但不是从 TextBox 派生的)。

我添加了一个 this 的实例,并使用 TwoWay 绑定(bind)将它绑定(bind)到我的 View 模型上的一个属性。

在我的自定义 TextBox 控件中,如何更新 Text 属性,以便将更改传播到 View 模型上的属性?

如果我在自定义控件上设置“文本”属性,它将替换绑定(bind),使 View 模型上的属性为空。

我原以为这很简单,但我不知道该怎么做(标准的 TextBox 控件必须这样做!)

干杯

编辑:

自定义控件:

public class SampleCustomControl : CustomControl
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}

public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(SampleCustomControl), new PropertyMetadata(null));

public void Update()
{
// This replaces my binding, I want it to pass the new value
// through to the "SomeProperty" two way binding.
Text = "some value";
}

}

用法:
<Controls:SampleCustomControl Text="{Binding SomeProperty, Mode=TwoWay}" />

最佳答案

您需要在 metadata of your dependency property 中添加属性更改回调.

当 Text 属性更改(从任一侧)时,将触发此回调。您可以使用从这里传入的值来更新您为显示文本而构建的自定义 UI。

更新:
回应你关于这是什么的评论。由于您的示例代码太模糊而无法测试,因此这是我用来测试您的问题的内容。

public class TestControl : ContentControl
{
private TextBlock _tb;

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_tb = new TextBlock();
_tb.Text = Text;
this.Content = _tb;
_tb.MouseLeftButtonDown += new MouseButtonEventHandler(_tb_MouseLeftButtonDown);
}

void _tb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Update();
}

public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}

public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(TestControl), new PropertyMetadata(string.Empty, OnTextChanged));

public void Update()
{
// This replaces my binding, I want it to pass the new value
// through to the "SomeProperty" two way binding.
Text = "some value";
}

public static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
((TestControl)sender).UpdateText((string)e.NewValue);
}

protected void UpdateText(string text)
{
if (_tb != null) _tb.Text = text;
}
}

然后,我使用双向绑定(bind)将控件上的 Text 属性绑定(bind)到 View 模型。当我单击 View 中的文本时, View 和 View 模型都会使用新文本“某个值”进行更新。如果我更新 View 模型中的值(并引发属性更改事件),则 View 和控件中的值会更新,因此绑定(bind)仍然有效。

您的示例中必须还有其他一些缺失的部分。

关于silverlight - 如何在双向绑定(bind)中传递来自源的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com