- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我设置目标控件的 DataContext 时,我有一个 OneWayToSource 绑定(bind),其行为不符合我的预期。源的属性被设置为默认值,而不是目标控件的属性值。
我在标准 WPF 窗口中创建了一个非常简单的程序来说明我的问题:
XAML
<StackPanel>
<TextBox x:Name="tb"
Text="{Binding Path=Text,Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"
TextChanged="TextBox_TextChanged"/>
<Button Content="Set DataContext" Click="Button1_Click"/>
</StackPanel>
MainWindow.cs
public partial class MainWindow : Window
{
private ViewModel _vm = new ViewModel();
private void Button1_Click(object sender, RoutedEventArgs e)
{
Debug.Print("'Set DataContext' button clicked");
tb.DataContext = _vm;
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Debug.Print("TextBox changed to " + tb.Text);
}
}
ViewModel.cs
public class ViewModel
{
private string _Text;
public string Text
{
get { return _Text; }
set
{
Debug.Print(
"ViewModel.Text (old value=" + (_Text ?? "<null>") +
", new value=" + (value ?? "<null>") + ")");
_Text = value;
}
}
}
TextBox tb
以空 DataContext 开始,因此预计绑定(bind)不会执行任何操作。因此,如果我在文本框中键入某些内容(例如“X”),ViewModel.Text 属性将保持为 null。
如果我随后单击Set DataContext按钮,我会期望将ViewModel.Text
属性设置为TextBox.Text的“X”
属性。相反,它被设置为“”。当然,绑定(bind)是有效的,因为如果我在文本框中输入“Y”,在“X”之后,它会将 ViewModel.Text
属性设置为“XY”。
这是一个输出示例(由于计算顺序,最后两行是违反直觉的,但它们肯定都在键入“Y”后立即发生):
TextBox changed to X
'Set DataContext' button clicked
ViewModel.Text (old value=<null>, new value=)
ViewModel.Text (old value=, new value=XY)
TextBox changed to XY
为什么在设置 DataContext 时将 ViewModel.Text
属性设置为“”而不是“X”?
我做错了什么?我错过了什么吗?我是否对绑定(bind)有什么误解?
编辑:我预计输出是:
TextBox changed to X
'Set DataContext' button clicked
ViewModel.Text (old value=<null>, new value=X)
ViewModel.Text (old value=X, new value=XY)
TextBox changed to XY
最佳答案
这是一个错误,也可能不是。微软声称这是设计使然。您首先输入 x,然后通过单击 Button 杀死 DataContext,这就是为什么 TextBox 包含 x 并且您的 viewModel.Text 属性被重新初始化(其为空)。当数据上下文改变时,getter 仍然会被调用。最终你没有机会解决这个问题。
但是,您可以使用两种方式并顺其自然。
关于c# - 当 DataContext 更改时,WPF 绑定(bind) OneWayToSource 将源属性设置为 "",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398199/
我正在使用 OneWayToSource绑定(bind),它似乎总是将我的源属性设置为空。为什么呢?这给我带来了麻烦,因为我需要源属性中目标属性的值而不是空值。 这是我的代码: MyViewModel
我有一个 RadioButton其 IsChecked 的元素属性绑定(bind)到 MyProperty在 ViewModel . Binding有模式OneWayToSource由于某些原因,它会
为什么 OneWayToSource 绑定(bind)会重置我的目标值?这是绑定(bind)代码: SolidColorBrush brush = GetTemplateChild("PART_Pre
我最近用 Binding Mode = OneWayToSource 做了很多测试,但我仍然不知道为什么会发生某些事情。 例如,我在类构造函数中为 dependency property 设置了一个值
我有一个自定义控件,它具有以下依赖属性 public static readonly DependencyProperty PrintCommandProperty = DependencyPrope
我有 EntitiesUserControl 负责 EntitiesCount 依赖属性: public static readonly DependencyProperty EntitiesCoun
是否可以在我的模型中使用 OneWay 模式将 TextBox Text 字段绑定(bind)到属性 TextView,并绑定(bind)到另一个属性 TextInput 模式为 OneWayToSo
我需要编写一个看起来像 TextBox 的自定义控件,它包含一个名为 Refresh() 的方法,其主要目的是清除文本并回滚一些其他值。 该方法应以某种方式变得可绑定(bind),以便其他人可以将其
我在一个窗口中有一个 TextBox,我使用以下简单的转换器将其绑定(bind)到一个值: public class TestConverter : MarkupExtension, IValueCo
我正在尝试以 OneWayToSource 作为模式绑定(bind)到 Readonly 属性,但似乎无法在 XAML 中完成: 我得到: The property 'FlagThingy.IsMo
我有一个只读属性,需要在文本框中显示,并在运行时收到此错误。我设置了 IsEnabled="False"、IsReadOnly="True" - 没有运气。其他搜索说只读应该修复它,但不适合我。我有一
我正在使用 MVVM 模式并在运行我的应用程序时收到以下信息 无效操作异常TwoWay 或 OneWayToSource 绑定(bind)无法对“ViewModel.SynergyViewModel”
我对特定的 xaml 数据绑定(bind)有疑问。我有两个列表框(主要细节,所以列表框将 IsSynchronizedWithCurrentItem 设置为 true)。我希望我的 View 模型知道
当我设置目标控件的 DataContext 时,我有一个 OneWayToSource 绑定(bind),其行为不符合我的预期。源的属性被设置为默认值,而不是目标控件的属性值。 我在标准 WPF 窗口
我最近在代码中将 OneWayToSource 绑定(bind)添加到 View 模型中的只读属性。当时我不知道 .Net 4 的变化,当没有 getter 时这会导致异常: ... public
我有这个 xaml 文本框 绑定(bind)到这个属性: public double? Min { get { return min; }
OneWayToSource .NET 4.0 中的绑定(bind)似乎已损坏 我有这个简单的 Xaml 我的代码是这样的 public MainWindow() {
以下出现在数据模板中: 设置SelectedIndex 后(如上所示),绑定(bind)到Value 的OneWayToSource 不起作用。如果我不设置 SelectedIndex,则可以绑定(
我有一个绑定(bind)到 People 集合的 DataGrid。我还有一个 TextBox,它应该接受所选行中的 Name 值。然后用户可以编辑该值或保留原样。关键点是:TextBox 中显示的文
我是一名优秀的程序员,十分优秀!