1

MainWindowクラスに次の依存関係プロパティがあります(WPFのWindowから継承します)

public ObservableCollection<ComputerListItem> ActiveComputers 
        {
            get { return (ObservableCollection<ComputerListItem>)this.GetValue(ActiveComputersProperty); }
            set { this.SetValue(ActiveComputersProperty, value); }
        }

        public static readonly DependencyProperty ActiveComputersProperty = DependencyProperty.Register(
            "ActiveComputers", typeof(ObservableCollection<ComputerListItem>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<ComputerListItem>()));

今、私はラベルに値を与えようとしているActiveComputers.Countので、XAMLではこれがあります:

<Window x:Class="ComputerManagerV3.MainWindow"        
        <!-- SNIP -->
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        >
    <Grid>
       <!--SNIP -->
        <Label Name="labelActive" Content="{Binding Source=ActiveComputers, Path=Count}" ></Label>

デザイナーでも、ラベルが現在表示している値は15です。これは、リストが最初に13個の要素で埋められているためです。そこで、いくつかのテストを追加しました。監視可能なコレクションにアイテムがいくつあっても、ラベルには常に値15:/が表示されます。また、出力ウィンドウにバインドエラーが表示されないため、何をすべきかわかりません。

私の質問:

  • バインディング式の値が常に15であるのはなぜですか?
  • リスト内のアイテムの数が常に表示されるように、正しいバインディングを作成するにはどうすればよいですか?
  • 値コンバーターを自分で作成せずにテキストを追加することは可能ですか?
4

3 に答える 3

4

バインディングのソースは、string15文字のリテラル「ActiveComputers」です。したがって、文字列内の文字数を表示しており、コレクションにはまったく接続されていません。

これを試して:

Content="{Binding ActiveComputers.Count}"
于 2012-06-28T14:36:49.003 に答える
2

Sourceプロパティを文字列に設定しており、 String.Count15です。

プロパティに正しくバインドするには、代わりにこれを使用します。

<Label Name="labelActive" Content="{Binding ActiveComputers.Count, 
     RelativeSource={RelativeSource AncestorType={x:Type Window}}" />

テキスト形式に関する3番目の質問については、ContentStringFormatプロパティを使用して、Label

于 2012-06-28T14:37:27.340 に答える
1

ここには複数の問題があります:

1)依存関係プロパティの登録では、クラスのすべてのインスタンスのプロパティに同じリストインスタンスを渡します。

public static readonly DependencyProperty ActiveComputersProperty =
    DependencyProperty.Register(
        "ActiveComputers",
         typeof(ObservableCollection<ComputerListItem>),
         typeof(MainWindow),
         new PropertyMetadata(new ObservableCollection<ComputerListItem>()))

代わりに、デフォルト値nullで登録し、クラスのコンストラクターでプロパティを設定します。

2)バインディングパスが間違っています。ソースはパスである必要があります。ElementNameは、XAML内の指定された名前からパスを開始するために使用されます。レイチェルの提案を使ってみてください...

DataSourceの代わりにRelativeSourceを使用してウィンドウでパスを開始し、次にActiveComputers.Countをパスとして使用します。

于 2012-06-28T14:45:58.960 に答える