WPf绑定问题

时间:2010-12-08 01:39:49

标签: wpf binding user-controls

我在WPF中创建了一个自定义控件,但我无法正确绑定它。如果我在后面的代码中明确设置了属性的值,那么一切正常。

这是我控制范围内TextBox的XAML:

<TextBox Name="txtText" Grid.Row="0" Grid.Column="0" IsReadOnly="True" Text="{Binding Text, Mode=OneWay}" />

后面代码中的相关属性如下:

public static readonly DependencyProperty TextConverterProperty = DependencyProperty.Register("TextConverter", typeof(IValueConverter), typeof(Selector));
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector));

public string Text
{
    get
    {
        string result = this.EntityId.ToString();

        if (this.TextConverter != null)
        {
            result = this.TextConverter.Convert(result, null, null, null) as string;
        }

        return result;
    }
}

public long EntityId
{
    get
    {
        return (long)this.GetValue(EntityIdProperty);
    }
    set
    {
        this.SetValue(EntityIdProperty, value);

        this.OnPropertyChanged("Text");
        this.OnPropertyChanged("EntityId");
    }
}

public IValueConverter TextConverter
{
    get
    {
        return this.GetValue(TextConverterProperty) as IValueConverter;
    }
    set
    {
        this.SetValue(TextConverterProperty, value);
    }
}

现在我的页面中的XAML实现:

<controls:Selector x:Name="txtReferringCase" EntityId="{Binding ReferringDACaseId}" TextConverter="{StaticResource daCaseNumberConverter}" Grid.Column="5" Grid.Row="0" Grid.ColumnSpan="3" ButtonClicked="txtReferringCase_ButtonClicked" />

现在这是奇怪的部分。我可以为页面设置DataContext但没有任何反应,但是当我取消注释注释行时,文本显示在我的用户控件中没有问题:

_caseScreen = new DACaseScreen(itemId);
this.DataContext = _caseScreen;
//this.txtReferringCase.EntityId = _caseScreen.ReferringDACaseId;
编辑:我忘了提到的另一件事......如果我点击断点并检查控件的EntityId和Text属性,它们都会显示我期望的值。看起来UI似乎没有更新。

2 个答案:

答案 0 :(得分:1)

DependencyProperties的getter和Setters只应调用GetValueSetValue,因为XAML不会使用它们,只是为了方便起见。如果你想要额外的行为,请注册你的DependencyProperty传递一个你想做的改变处理程序。

public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector),new UIPropertyMetadata(EntityIdChanged));

public long EntityId
{
    get
    {
        return (long)this.GetValue(EntityIdProperty);
    }
    set
    {
        this.SetValue(EntityIdProperty, value);
    }
}

private static void EntityIdChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var control = (Selector)sender;
    control.OnPropertyChanged("Text");
}

您无需为依赖项属性调用PropertyChanged。我还需要更改UserControl中的txtText绑定,将源设置为控件本身而不是DataContext,但如果在代码中设置属性,则应该没问题。您可能希望重命名控件,因为有一个名为Selector的内置控件,但它并不重要。

答案 1 :(得分:0)

在进行OnPropertyChanged通话之前,您的用户界面不会更新。设置DataContext不会解雇此问题。

另外你做了:

public static readonly DependencyProperty TextConverterProperty = DependencyProperty.Register("TextConverter", typeof(IValueConverter), typeof(Selector));
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector));

但是你没有注册Text依赖项,只注册TextConverter和EntityId。意思是,你的OnPropertyChanged不起作用(?)(或者你只是忘了在这里显示那条线:))