2

我有一个自定义用户控件,它有一个文本块,其文本有时会发生变化。TextBlocks 代码是

XAML:

<TextBlock Text="{Binding ElementName=dashboardcounter, Path=Counter}" FontFamily="{Binding ElementName=dashboardcounter, Path=FontFamily}"   HorizontalAlignment="Left" Margin="17,5,0,0" VerticalAlignment="Top" FontSize="32" Foreground="#FF5C636C"/>

。CS:

private static readonly DependencyProperty CounterProperty = DependencyProperty.Register("Counter", typeof(string), typeof(DashboardCounter));

public string Counter
{
    get { return (string)GetValue(CounterProperty); }
    set { SetValue(CounterProperty, value); }
}

我的课:

private string _errorsCount;
public string ErrorsCount
{
    get { return _errorsCount; }
    set { _errorsCount = value; NotifyPropertyChanged("ErrorsCount"); }
}

public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (null != handler)
    {
      handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

所述用户控件的绑定:

dashboardCounter.Counter = view.ErrorsCount;

TextBlock 显示 - 绝对没有。

我究竟做错了什么?字符串是动态的,有时会发生变化。它最初是一个 Int 但我选择它作为字符串而不是转换我的“Count”toString() 而不是创建一个 IValueConverter

4

1 回答 1

2

通过使用dashboardCounter.Counter = view.ErrorsCount;,您只是调用了依赖属性的设置器,而后者又调用了DependencyProperty.SetValue方法。

这是它的官方描述(来自msdn):

设置依赖属性的本地值,由其依赖属性标识符指定。

它设置本地值,仅此而已(当然,在此分配之后,您的绑定和您的文本块当然会更新)。

Counter但是您的财产和您的财产之间没有绑定创建ErrorsCount

因此更新ErrorsCount不会更新Counter,因此您TextBlock也不会更新。

在您的示例中, whendashboardCounter.Counter = view.ErrorsCount;可能在初始化阶段被调用,Counter设置为string.Emptyor null(假设这是该ErrorsCount点的值)并且将保持不变。没有创建绑定,更新ErrorsCount不会影响Counter您的视图。

您至少有 3 个解决方案来解决您的问题:

1 . Text将您的属性直接绑定到实际更改的DependencyProperty或“受控属性”(最常见的情况)INotifyPropertyChanged

2 . 自己以编程方式创建所需的绑定,而不是使用dashboardCounter.Counter = view.ErrorsCount;. 你会在这里找到一个简短的官方教程,代码可能如下所示:

 Binding yourbinding = new Binding("ErrorsCount");
 myBinding.Source = view;
 BindingOperations.SetBinding(dashboardCounter.nameofyourTextBlock, TextBlock.TextProperty, yourbinding);

3 . 当然,将您的ErrorsCount属性绑定到CounterXAML 中的属性,但我不知道它是否符合您的需求:

<YourDashboardCounterControl Counter="{Binding Path=ErrorsCount Source=IfYouNeedIt}"
于 2013-11-01T00:16:38.447 回答