Binding 为什么';这不是WPF装订工作吗?
我找不到工作用的活页夹。我创造了一个完全没有结果的例子来证明我的问题。事情是这样的 我希望能够在XAML中定义一组小部件。此集合将与UserControl关联。在XAML中,我希望将小部件的“Name”属性绑定到数据位(本例中为字符串) 因此,对于代码,我有一个从DependencyObject派生的小部件类Binding 为什么';这不是WPF装订工作吗?,binding,Binding,我找不到工作用的活页夹。我创造了一个完全没有结果的例子来证明我的问题。事情是这样的 我希望能够在XAML中定义一组小部件。此集合将与UserControl关联。在XAML中,我希望将小部件的“Name”属性绑定到数据位(本例中为字符串) 因此,对于代码,我有一个从DependencyObject派生的小部件类 public class Widget : DependencyObject { public string Name { get { return (st
public class Widget : DependencyObject
{
public string Name
{
get { return (string)GetValue(NameProperty); }
set { SetValue(NameProperty, value); }
}
// Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register("Name", typeof(string), typeof(Widget), new UIPropertyMetadata("--widget--"));
}
请注意,此属性的默认值为“-widget-->”。我还有一个WidgetCollection类
public class WidgetCollection : Collection<Widget>
{
public WidgetCollection()
{
}
}
当这个演示运行时,窗口如下所示
[老鼠!因为我是一个新的提交者,所以图片被修改了]我将用文本模拟它
-----------
| |
| | <-- red rectangle (the WidgetControl)
| |
-----------
Sprocket
Crank <-- textblocks
Wheel
Wrench
-----------
Sprocket
--widget-- <-- listbox
--widget--
Wrench
-----------
-----------
| |
||我只是在暗中拍摄,但我认为您的DependencyProperty名称已正确绑定到,但当它从--widget--“更改为”Crank“时,更改不会传播到显示名称的任何位置。您需要在DependencyProperty.Register上设置回调
Widget到底做什么?嗯,我找到了一些答案。这两种技术似乎都能奏效,而且都非常有用。作为一个新的海报,我只能提交一个超链接。因此,您可以搜索“将虚拟分支附加到逻辑树-由Josh Smith编写”,和/或您可以转到此链接以获取我最喜欢的
就我个人而言,我喜欢从Freezable派生我的小部件,因为它需要更少的填充,并且对初始化顺序不敏感。。Josh的解决方案只有在调用InitializeComponent()之后设置DataContext时才有效,就像这样
public MainWindow()
{
Loaded += new RoutedEventHandler(MainWindow_Loaded);
InitializeComponent();
DataContext = this;
}
注意:在我的例子中,仅仅从Freezable派生小部件是不够的。我还必须从FreezableCollection派生WidgetCollection强>
案例结束。在使用调试器时,我可以看到对于两个数据绑定小部件,“Name”仍然是--widget--。。。所以,这不仅仅是一个UI刷新/传播问题。在本例中,Widget除了帮助演示绑定问题外,什么都不做。@David:是否调用了属性“Name”的setter?已经有一段时间了,但这与您的基类是DependencyObject而不是UIElement、FrameworkElement或控件有关……我想。谢谢您的阅读和思考。我想你指的是Widget类吧?我试过了,但没有成功。
<Window x:Class="StackOverflow.BindingProblem.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:StackOverflow.BindingProblem"
Title="MainWindow" Height="220" Width="160"
x:Name="x_win">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<l:WidgetControl x:Name="x_WidgetControl" Grid.Row="0">
<l:Widget Name="Sprocket"/>
<l:Widget Name="{Binding Path=WidgetName1, ElementName=x_win}"/>
<l:Widget Name="{Binding Path=WidgetName2, ElementName=x_win}"/>
<l:Widget Name="Wrench"/>
</l:WidgetControl>
<StackPanel Orientation="Vertical" Grid.Row="1">
<TextBlock Text="Sprocket"/>
<TextBlock Text="{Binding Path=WidgetName1, ElementName=x_win}"/>
<TextBlock Text="{Binding Path=WidgetName2, ElementName=x_win}"/>
<TextBlock Text="Wrench"/>
</StackPanel>
<ListBox x:Name="x_ListBox" Grid.Row="2"/>
</Grid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
Loaded += new RoutedEventHandler(MainWindow_Loaded);
InitializeComponent();
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
x_ListBox.ItemsSource = x_WidgetControl.GetWidgetNames();
}
public string WidgetName1
{
get { return "Crank"; }
}
public string WidgetName2
{
get { return "Wheel"; }
}
}
-----------
| |
| | <-- red rectangle (the WidgetControl)
| |
-----------
Sprocket
Crank <-- textblocks
Wheel
Wrench
-----------
Sprocket
--widget-- <-- listbox
--widget--
Wrench
-----------
public MainWindow()
{
Loaded += new RoutedEventHandler(MainWindow_Loaded);
InitializeComponent();
DataContext = this;
}