2016-08-11 23 views
0

は、私はこのようなリストビューを持って変更しました。スレッドはアイテムを解析し、終了時にフィールドを更新します。フィールドが更新されると、メソッドOnPropertyChangedが呼び出されます。私のUserControl local:StatusElementを使用しているもの以外のすべてのフィールドで正常に動作します。 NAMEのようなSTATUSを表示しようとしましたが、正しくリフレッシュされましたが、local:StatusElementではリフレッシュはありません。 StatusElement.Stateの取得/設定のブレークポイントには決して達しません。更新リストビュー項目は

マイユーザーコントロール:

<UserControl ... 
      x:Name="mainControl"> 
    <Grid Name="LabelGrid"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Image Grid.Column="0" Name="MyImage" 
       Source="{Binding Source, Source={StaticResource MyImage}}" 
       Width="{Binding Height, ElementName=mainControl}" 
       Height="{Binding Height, ElementName=mainControl}"/> 
     <Label Grid.Column="1" Name="statusLabel"/> 
    </Grid> 
</UserControl> 

と:

​​

私statusLabelのコンテンツが更新されないのはなぜ?

+0

「UpdateSourceTrigger = PropertyChanged」は、一方向バインディングでは効果がありません(ターゲットからソースへのデータフローがないため)。それに加えて、明示的に 'Mode = OneWay'を設定するのは通常は冗長です。これは、ほとんどの依存プロパティのデフォルトです。 – Clemens

答えて

2

State依存関係プロパティのあなたの定義が間違っています。

CLRプロパティラッパーは、プロパティを所有するDependencyObjectのGetValueSetValueメソッドを呼び出す必要がありますが、下図のようになります。

public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", 
    typeof(string), 
    typeof(StatusElement), 
    new PropertyMetadata(null, (o, e) => ((StatusElement)o).RefreshState())); 

public string State 
{ 
    get { return (string)GetValue(StateProperty); } 
    set { SetValue(StateProperty, value); } 
} 

PropertyMetadataコンストラクタの2番目の引数に注意してください。これはスタンプPropertyChangedCallbackであり、ラムダ式として実装されています。

+0

Perfectを実行しません!私はこの方法を知らなかった、ありがとう。 –

1

クラスがINotifyPropertyChangedイベントを実装していません。更新を実現するために実装します。

プロパティ値が変更されたことをクライアントに通知します。

public partial class StatusElement : UserControl,INotifyPropertyChanged 
{ 
.... 

public event PropertyChangedEventHandler PropertyChanged; 

private void RefreshState([CallerMemberName]string prop = "") 
{ 
    switch (State) 
    { 
     case "": 
      MyImage.Visibility = Visibility.Hidden; 
      break; 
     default: 
      MyImage.Visibility = Visibility.Visible; 
      break; 
    } 
    statusLabel.Content = State; 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(prop)); 

    } 
} 
} 
+0

プロパティは通常、既に組み込まれている変更通知メカニズムを持つ依存プロパティとして定義されるため、通常はUserControlでINotifyPropertyChangedを実装する必要はありません。 – Clemens

+0

私はこれを見ることができるチュートリアルはありますか? – Sadique

+0

Google "wpfカスタム依存プロパティ" – Clemens

関連する問題