自定义Usercontrol TextBlock.text绑定

时间:2013-10-31 23:26:07

标签: c# wpf xaml binding user-controls

我有一个Custom Usercontrol,它有一个文本块,其文本有时会改变。 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”转换为String()而不是创建一个IValueConverter

1 个答案:

答案 0 :(得分:2)

使用dashboardCounter.Counter = view.ErrorsCount;,您只是调用依赖项属性的setter,而后者又调用DependencyProperty.SetValue方法。

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

  

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

它设置了本地值,这就是全部(当然,按照此分配,您的绑定和文本块当然会更新)。

但是您Counter属性与ErrorsCount属性之间没有绑定创建。

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

在您的示例中,可能在初始化阶段调用dashboardCounter.Counter = view.ErrorsCount;时,Counter设置为string.Emptynull(假设此值为{{1}在那一点上)并将保持不变。未创建任何绑定,更新ErrorsCount不会影响ErrorsCount或您的观点。

您至少有3种解决方案可以解决您的问题:

<强> 1 即可。直接将Counter属性绑定到Text或实际更改的“DependencyProperty有源属性”(最常见的情况)

<强> 2 即可。以编程方式自行创建所需的绑定,而不是使用INotifyPropertyChanged。您将在here中找到一个简短的官方教程,代码可能如下所示:

dashboardCounter.Counter = view.ErrorsCount;

第3 即可。当然,将您的 Binding yourbinding = new Binding("ErrorsCount"); myBinding.Source = view; BindingOperations.SetBinding(dashboardCounter.nameofyourTextBlock, TextBlock.TextProperty, yourbinding); 属性绑定到XAML中的ErrorsCount属性,但我不知道它是否符合您的需求:

Counter