0

SL BusyIndi​​cator をビジー メッセージのコレクションにバインドしようとしています。コレクションにアイテムがある場合、インジケーターにメッセージが表示されます。メッセージのコレクションが空の場合、インジケーターは非表示になります。

まず、インジケーターにメッセージが表示されません。表示されるのは、不確定な進行状況バーがある空のインジケーター ボックスだけです。

<UserControl.Resources>

...
<anotherAssembly:CollectionToBoolConverter x:Key="CollectionToBoolConverter" />

<DataTemplate x:Key="LoadingMessageDataTemplate">
    <ItemsControl x:Name="itemsControl" ItemsSource="{Binding AllocationLoadingMessages}" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</DataTemplate>

...

</UserControl.Resources>

...

<controlToolkit:BusyIndicator 
    IsBusy="{Binding AllocationLoadingMessages, Converter={StaticResource CollectionToBoolConverter}}"
    BusyContent="{Binding AllocationLoadingMessages}"
    BusyContentTemplate="{StaticResource LoadingMessageDataTemplate}"/>
///content
</controlToolkit:BusyIndicator>

...

ビューモデル:

    private ObservableCollection<string> _allocationLoadingMessages = new ObservableCollection<string>();
    public ObservableCollection<string> AllocationLoadingMessages
    {
        get { return _allocationLoadingMessages; }
        set
        {
            SetValue(ref _allocationLoadingMessages, value, "AllocationLoadingMessages");
        }
    }

では、Indiciator でメッセージの簡単なリストを取得するにはどうすればよいでしょうか?

ありがとう、
マーク

4

1 に答える 1

0

コードはターゲットに非常に近いので、これを機能させるために必要なのは、行を置き換えることだけです。

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding AllocationLoadingMessages}" >

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding}" >

これはSilverlight3と5の両方でテストしたので、4でも機能すると思います。

プロパティのset { }コードが何のためにあるのかわかりません。AllocationLoadingMessagesコレクションに変更を加えるたびにコレクションを置き換える必要はありません。それが機能するようになったとき、ビューモデルで行ったのはこれだけでした。

    public ObservableCollection<string> AllocationLoadingMessages { get; set; }

    private int _loadingMessageNumber = 0;
    private void Add()
    {
        AllocationLoadingMessages.Add( "Loading message #" + ++_loadingMessageNumber );
        PropertyChanged( this, new PropertyChangedEventArgs( "AllocationLoadingMessages" ) );
    }

    private void RemoveFirst()
    {
        if( AllocationLoadingMessages.Count > 0 )
        {
            AllocationLoadingMessages.RemoveAt( 0 );
            PropertyChanged( this, new PropertyChangedEventArgs( "AllocationLoadingMessages" ) );
        }
    }

遅れて申し訳ありませんが(今までこの質問に出くわしませんでした)、少なくともこれに対する答えを探している他の人に役立つことを願っています。

于 2012-04-11T08:46:31.607 に答える