C# 如何设置依赖项属性值?
请参考下面的代码了解上下文C# 如何设置依赖项属性值?,c#,wpf,xaml,data-binding,dependency-properties,C#,Wpf,Xaml,Data Binding,Dependency Properties,请参考下面的代码了解上下文 启动时,两个文本框的文本将为“这是原始值” 单击测试框的按钮(“测试按钮”)时: TestBox的TextBox的文本将更改为“按测试按钮设置” 另一个文本框的值不会更改 单击窗口的按钮时,两个文本框的文本都应更改为“按窗口设置”。但是,只有普通文本框得到更新,TestBox没有更新问题是您要求绑定系统不同步。整个系统旨在保持所有绑定元素的同步。只有在绑定模式设置为“双向”或“单向源”时,才能在不破坏基础绑定的情况下设置依赖项属性的值。在这些条件下,值被传输回源
- 启动时,两个文本框的文本将为“这是原始值”
- 单击
测试框的按钮(“测试按钮”)时:
的TestBox
的文本将更改为“按测试按钮设置”TextBox
- 另一个文本框的值不会更改李>
- 单击
窗口的按钮时,两个文本框的文本都应更改为“按窗口设置”。但是,只有普通文本框得到更新,
没有更新问题是您要求绑定系统不同步。整个系统旨在保持所有绑定元素的同步。只有在绑定模式设置为“双向”或“单向源”时,才能在不破坏基础绑定的情况下设置依赖项属性的值。在这些条件下,值被传输回源,因此,系统保持同步。但是,在您的情况下,双向绑定将导致两个按钮同时更改两个文本框 您将需要使用两个依赖项属性TestBox。第一个依赖项属性将绑定到内部文本框,第二个将绑定到父窗口中的。然后,需要将属性更改处理程序添加到第二个依赖项属性(在FrameworkPropertyMetadata中完成)。在这个处理程序中,只需设置第一个依赖项属性的值 由于您使用的是带有代码隐藏的UserControl,因此更简单的解决方案是只使用上面提到的第二个dependency属性,并通过其x:Name直接将值(来自事件处理程序和属性更改处理程序)设置到textbox上TestBox
如果您需要更多说明,请告诉我。由于您是单向绑定
,当源
更改时,绑定目标
将不会更新,因此其他源
绑定到相同的目标
也不会被修改。。。似乎很明显。。请参阅以了解绑定源和目标的工作方式。windows中的绑定是单向的,将其设置为双向,所有内容都将更新。此外,您正在绑定到POCO属性,因此不会收到更新通知。。。我不确定您想要的行为是什么,所以我无法判断到底出了什么问题……而且,更改UI元素的源
不会影响其他元素(除非它们是相关UI元素的逻辑子元素,并且它们本身没有明确定义的DataContext
。@HighCore,对,这正是我想要的。@Will,@HighCore,”当单击DataContext
窗口的按钮时,两个文本框的文本都应更改为“按窗口设置”。但是,只有普通的
得到更新,而文本框
没有更新测试框
<UserControl x:Class="Company.UserControls.TestBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="TextBoxControl"> <StackPanel> <TextBox MinWidth="100" Name="TestTextBox" Text="{Binding Path=Test, ElementName=TextBoxControl, Mode=TwoWay}" /> <Button MinWidth="100" Content="Test Button" Click="ButtonBase_OnClick" /> </StackPanel> </UserControl>
using System.Windows; namespace Company.UserControls { public partial class TestBox { public const string TestString = "Set By Test Button"; public TestBox() { InitializeComponent(); } public static readonly DependencyProperty TestProperty = DependencyProperty.Register( "Test", typeof(string), typeof(TestBox), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); public string Test { get { return (string)GetValue(TestProperty); } set { SetValue(TestProperty, value); } } private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { /****** THIS OBLITERATES THE BINDING ******/ Test = TestString; /****** THIS OBLITERATES THE BINDING ******/ } } }
<Window x:Class="Company.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:u="clr-namespace:Company.UserControls" Title="MainWindow"> <StackPanel x:Name="MyStackPanel"> <TextBox Text="{Binding Path=MyTestValue, Mode=OneWay}"/> <u:TestBox x:Name="MyTestBox" Test="{Binding Path=MyTestValue, Mode=OneWay}"/> <Button Content="Click" Click="ButtonBase_OnClick" /> </StackPanel> </Window>
using System.Windows; namespace Company { public partial class MainWindow { public MainWindow() { InitializeComponent(); MyStackPanel.DataContext = new MyThing { MyTestValue = "This is the Original Value" }; } private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { MyStackPanel.DataContext = new MyThing { MyTestValue = "Set by Window" }; } } public class MyThing { public string MyTestValue { get; set; } } }