1

我们有一个 TickerUserControl,它有一个简单的 Text 属性,它代表股票代码的显示文本。

  1. 我们真的必须在 UserControl 中使用这些 DependencyProperty 模式的东西(见下文)还是有更简单的方法来实现这一点?

  2. 当我们想使用我们的 UserControl 并将文本字段绑定到 ViewModel 的属性时,我们必须使用以下奇怪的绑定语法。为什么我们不能像所有其他控件一样只使用 'Text="{Binding Text}"' ?UserControl 的属性实现有什么问题吗?

用户控件的使用

<userControls:TickerUserControl Text="{Binding Path=Parent.DataContext.TickerText, RelativeSource={RelativeSource Self}, Mode=OneWay}"/>

UserControl 的属性实现(代码隐藏)

public partial class TickerUserControl : UserControl
{
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); } 
    }

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(TickerUserControl), new PropertyMetadata(""));

    // ...
}

UserControl 的 XAML 片段

<UserControl x:Class="Project.UserControls.TickerUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
             mc:Ignorable="d">
    <TextBlock Text="{Binding Text}">

        <!-- ... -->     

解决方案

问题是 UserControl 内的 DataContext 的设置。我删除了 DataContext 绑定,为 UserControl 添加了一个名称,并修改了 UserControl 内的 TextBox 绑定。之后,我能够从外部“照常”绑定。

<userControls:TickerUserControl Text="{Binding TickerText}"/>

<UserControl x:Class="Project.UserControls.TickerUserControl"
             Name="TickerUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d">
    <TextBlock Text="{Binding Text, ElementName=TickerUserControl}">

        <!-- ... -->
4

2 回答 2

5

如果你想绑定你的属性,你需要一个依赖属性。

要解决奇怪的绑定,您可以进行以下更改:

在您的用户控件中

<UserControl Name="control"...
<TextBlock Text="{Binding Text, ElementName=control}">

然后你可以像这样绑定它

<userControls:TickerUserControl Text="{Binding TickerText}"/>
于 2013-08-14T08:34:19.460 回答
1
  1. 如果你想在你的后面的代码中创建可绑定的属性UserControl,那么是的,你必须使用DependencyProperty对象。但是,您不必在那里创建可绑定属性...您可以使用 MVVM 类型模式并在单独的类中创建可绑定属性,只要您将该类设置为DataContextof you UserControl

  2. 不,您不必使用那种“奇怪”的绑定语法……问题是您已经硬编码将DataContextUserControl的代码设置为后面的代码。而不是这样做,您可以Text DependencyProperty像这样在控件中绑定您的:

    <TextBlock Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, 
    {AncestorType={x:Type Local:TickerUserControl}}}" />
    

Local是您本地项目的 XML 命名空间......像这样:

     xmlns:Local="clr-namespace:Project.UserControls.TickerUserControl"

然后去掉DataContext绑定后,应该可以正常从外部绑定到控件了。

于 2013-08-14T08:40:04.310 回答