我说得对,因为我看到的所有例子似乎都相互矛盾,或者在某些方面都不尽如人意。我需要能够从XAML将类对象绑定到我的DP或在cb中以编程方式设置它:
<local:MyControl MyDP="{Binding MyObject}"/>
或
MyControl mycontrol = new MyControl(){MyDP = MyObject};
然后在控件内,双向绑定元素到绑定对象的属性:
<TextBox text="{Binding MyDP.text, ElementName=MyControl}"/>
我认为这是非常标准的东西,但是我在试图写例子的人中看到的缺乏凝聚力使我不相信。
答案 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...");