在允许双向绑定的用户控件中创建依赖项属性的正确方法是什么

时间:2016-03-03 21:42:50

标签: c# wpf

我说得对,因为我看到的所有例子似乎都相互矛盾,或者在某些方面都不尽如人意。我需要能够从XAML将类对象绑定到我的DP或在cb中以编程方式设置它:

<local:MyControl MyDP="{Binding MyObject}"/>

MyControl mycontrol = new MyControl(){MyDP = MyObject};

然后在控件内,双向绑定元素到绑定对象的属性:

<TextBox text="{Binding MyDP.text, ElementName=MyControl}"/>

我认为这是非常标准的东西,但是我在试图写例子的人中看到的缺乏凝聚力使我不相信。

1 个答案:

答案 0 :(得分:2)

我就是这样做的:

假设包含状态栏(用户控件)的父控件,它的标记如下所示:

    <ContentControl x:Name="XFoot" Grid.Row="1" Grid.ColumnSpan="3" >
        <UserControls:UCStatusBar />
    </ContentControl>

现在在UserControl命名状态栏中,它的依赖属性如下所示:

   public StatusUpdate CurrentStatus
        {
            get { return (StatusUpdate)GetValue(CurrentStatusProperty); }
            set { SetValue(CurrentStatusProperty, value); }
        }

        // Using a DependencyProperty as the backing store for CurrentStatus.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CurrentStatusProperty =
            DependencyProperty.Register("CurrentStatus", typeof(StatusUpdate), typeof(UCStatusBar), 
                new PropertyMetadata(
                        new StatusUpdate() {  ErrorMessage="", IsIndeterminate=false, Status="Ready"}
                        )
                );

状态更新如下所示,它只是状态栏中显示的三个属性的容器。

 public class StatusUpdate
    {
       public StatusUpdate()
       {
           Status = "";
           ErrorMessage = "";
           IsIndeterminate = true;
       }
        public string Status { get; set; }
        public string ErrorMessage { get; set; }
        public bool IsIndeterminate { get; set; }
    }
}

任何人都可以通过访问状态栏的CurrentStatus属性来更新状态栏。注意要进行双向绑定,这是在XAML中完成的......在绑定指令中,只需按空格键,属性窗口将显示绑定模式。选择两种方式。

PS:在Visual Studio中,当您首次创建DP时,只需键入propdp并按Tab键,即可自动为您插入整个DP结构。因此,DP很容易实现。

DP如何双向工作?

如果您正在使用XAML绑定,您只需通过MODE属性告诉它它是双向的。这意味着GUI更改将在用户更改值时更新属性。

<TextBox Text="{Binding Path=ThePropertyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

注意Mode值和UpdateSourceTrigger说,不希望焦点改变,立即更新。

等一下,当我绑定并进行更改时,没有任何事情发生!

绑定工作需要三件事1)DataContext必须在代码后面或在XAML中作为静态资源设置2)属性名的路径名必须与CLR属性名完全相同3)必须有该物业的内容。

我可以从其他地方触发事件来更新属性吗? 当然......第一步是在UserControl中设置静态事件处理程序,如下所示:

public static EventHandler<string> NewData;

然后在CTOR线上就像这样:

NewData+=OnNewData;

然后事件处理程序如下所示:

 private void OnNewData(object sender, string data){
   //setting this string property notifies WPF to update the GUI
   ThePropertyName = data;
  }

其他代码执行此操作...

MyUserControl.OnNewData(this, "Now is the time for all good men to...");