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 でしたが、代わりに文字列にすることを選択し、IValueConverter を作成する代わりに「Count」を String() に変換しました

4

1 に答える 1

2

を使用dashboardCounter.Counter = view.ErrorsCount;することで、依存関係プロパティのセッターを呼び出すだけで、それがDependencyProperty.SetValueメソッドを呼び出します。

それの公式の説明は次のとおりです(msdnから):

依存関係プロパティ識別子で指定された依存関係プロパティのローカル値を設定します。

ローカル値を設定するだけです(もちろん、この割り当てに続いて、バインディングとテキストブロックが更新されます)。

Counterただし、プロパティとプロパティの間に拘束力のある作成はありませんErrorsCount

したがって、更新しても更新されErrorsCountCounter、その結果、あなたTextBlockも更新されません。

あなたの例でdashboardCounter.Counter = view.ErrorsCount;は、おそらく初期化フェーズ中に呼び出されたときに、またはCounterに設定され(これがその時点での値であると仮定)、変更されません。バインディングが作成されていないため、更新してもビューには影響しません。string.EmptynullErrorsCountErrorsCountCounter

問題を解決するには、少なくとも 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もちろん、プロパティを XAMLのプロパティにバインドしますCounterが、ニーズに合うかどうかはわかりません。

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