Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何设置依赖项属性值?_C#_Wpf_Xaml_Data Binding_Dependency Properties - Fatal编程技术网

C# 如何设置依赖项属性值?

C# 如何设置依赖项属性值?,c#,wpf,xaml,data-binding,dependency-properties,C#,Wpf,Xaml,Data Binding,Dependency Properties,请参考下面的代码了解上下文 启动时,两个文本框的文本将为“这是原始值” 单击测试框的按钮(“测试按钮”)时: TestBox的TextBox的文本将更改为“按测试按钮设置” 另一个文本框的值不会更改 单击窗口的按钮时,两个文本框的文本都应更改为“按窗口设置”。但是,只有普通文本框得到更新,TestBox没有更新问题是您要求绑定系统不同步。整个系统旨在保持所有绑定元素的同步。只有在绑定模式设置为“双向”或“单向源”时,才能在不破坏基础绑定的情况下设置依赖项属性的值。在这些条件下,值被传输回源

请参考下面的代码了解上下文

  • 启动时,两个文本框的文本将为“这是原始值”
  • 单击
    测试框的按钮(“测试按钮”)时:
    
    • TestBox
      TextBox
      的文本将更改为“按测试按钮设置”
    • 另一个文本框的值不会更改

  • 单击
    窗口的按钮时,两个文本框的文本都应更改为“按窗口设置”。但是,只有普通文本框得到更新,
    TestBox
    没有更新问题是您要求绑定系统不同步。整个系统旨在保持所有绑定元素的同步。只有在绑定模式设置为“双向”或“单向源”时,才能在不破坏基础绑定的情况下设置依赖项属性的值。在这些条件下,值被传输回源,因此,系统保持同步。但是,在您的情况下,双向绑定将导致两个按钮同时更改两个文本框

    您将需要使用两个依赖项属性TestBox。第一个依赖项属性将绑定到内部文本框,第二个将绑定到父窗口中的。然后,需要将属性更改处理程序添加到第二个依赖项属性(在FrameworkPropertyMetadata中完成)。在这个处理程序中,只需设置第一个依赖项属性的值

    由于您使用的是带有代码隐藏的UserControl,因此更简单的解决方案是只使用上面提到的第二个dependency属性,并通过其x:Name直接将值(来自事件处理程序和属性更改处理程序)设置到textbox上


    如果您需要更多说明,请告诉我。

    由于您是单向绑定
    ,当
    目标
    更改时,绑定
    将不会更新,因此其他
    目标
    绑定到相同的
    也不会被修改。。。似乎很明显。。请参阅以了解绑定源和目标的工作方式。windows中的绑定是单向的,将其设置为双向,所有内容都将更新。此外,您正在绑定到POCO属性,因此不会收到更新通知。。。我不确定您想要的行为是什么,所以我无法判断到底出了什么问题……而且,更改UI元素的
    DataContext
    不会影响其他元素(除非它们是相关UI元素的逻辑子元素,并且它们本身没有明确定义的
    DataContext
    。@HighCore,对,这正是我想要的。@Will,@HighCore,”当单击
    窗口的按钮时,两个文本框的文本都应更改为“按窗口设置”。但是,只有普通的
    文本框
    得到更新,而
    测试框
    没有更新
    <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; }
        }
    }