我想使用依赖项属性,以便我的标签显示在列表框中选择的值。这只是为了更清楚地理解依赖属性的工作。
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WPFToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
xmlns:local="clr-namespace:WpfApplication1" x:Name="MyWindow"
Height="200" Width="300" >
<StackPanel>
<ListBox x:Name="lbColor" Width="248" Height="56" ItemsSource="{Binding TestColor}"/>
<StackPanel>
<Label Content="{Binding Path=Test, ElementName=lbColor}" />
</StackPanel>
</StackPanel>
</Window>
代码背后,
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public ObservableCollection<string> TestColor { get; set; }
public String Test
{
get { return (String)GetValue(TestProperty); }
set { SetValue(TestProperty, value); }
}
// Using a DependencyProperty as the backing store for Title. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TestProperty =
DependencyProperty.Register("Test", typeof(String), typeof(ListBox), new UIPropertyMetadata("Test1"));
public Window1()
{
InitializeComponent();
TestColor = new ObservableCollection<string>();
DataContext = this;
TestColor.Add("Red");
TestColor.Add("Orange");
TestColor.Add("Yellow");
TestColor.Add("Green");
TestColor.Add("Blue");
}
}
}
任何人都可以解释我如何使用依赖属性来伴随它。不知何故,我对Dependency Property概念感到困惑,我只想看到一个有效的例子。
答案 0 :(得分:1)
您需要让ListBox“选择”当前文本:
<StackPanel>
<!-- Add selected item binding -->
<ListBox
x:Name="lbColor" Width="248" Height="56"
ItemsSource="{Binding TestColor}"
SelectedItem="{Binding Test}"
/>
<StackPanel>
<!-- No need for elementname - just use Test on the DataContext -->
<Label Content="{Binding Path=Test}" />
</StackPanel>
</StackPanel>
答案 1 :(得分:1)
我喜欢将Data Binding视为老大哥。绑定系统将自己设置为观察其所有已注册的绑定,并且当出现正确的标准时(例如,FocusLost或PropertyChanged),绑定系统将源值复制到目标。对于TwoWay或OneWayToSource绑定,如果正确的标准发生,绑定系统甚至会从目标复制到源。
目标必须是DependencyProperty,因为这是一种特殊的属性,它知道如何依赖其他值。 XAML {Binding}
正在做什么是创建一个新的BindingExpression,然后调用BindingOperations.SetBinding,它将绑定系统注册到特定的BindingExpression,因此它知道如何观察和执行更新。
这样做的好处是目标和源都不需要负责编写代码来明确更新另一个。如果我有代码知道如何提供颜色列表,为什么我应该关心颜色如何表示给用户?因为绑定系统负责绑定,所以如果使用我的Colors的目标是列表框,树视图或任何其他知道如何处理项目列表的对象,对我来说无关紧要。我可以专注于我关心的事情(我正在公开的公共界面),并且不必关心将该界面粘合到其他东西上的混乱细节。