0

リストボックスに項目がない場合、「データなし」の表示に近づく可能性があります。私は wp7 を使用していて、silverlight を使用しているため、DataTriggers を使用できません。そのため、アプリ全体で一貫して動作するようにコントロールを作成しました。しかし、 set メソッドのブレークポイントを設定すると、まったく呼び出されません!

コントロールクラス

public class EmptyListBox : ListBox
{
    public new IEnumerable ItemsSource
    {
        get 
        {
            return base.ItemsSource; 
        }

        set
        {    
            // never here
            base.ItemsSource = value;
            ItemsSourceChanged();
        }
    }

    protected virtual void ItemsSourceChanged()
    {
        bool noItems = Items.Count == 0;

        if (noItems)
        {
            if (Parent is System.Windows.Controls.Panel)
            {
                var p = Parent as Panel;

                TextBlock noData = new TextBlock();
                noData.Text = "No data";
                noData.HorizontalAlignment = HorizontalAlignment;
                noData.Width = Width;
                noData.Height = Height;
                noData.Margin = Margin;

                p.Children.Add(noData);
                Visibility = System.Windows.Visibility.Collapsed;
            }
        }
    }
}

これはxamlです

<my:EmptyListBox ItemsSource="{Binding Path=MyData}" Name="myListBox">
    <my:EmptyListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=name}" />
        </DataTemplate>
    </my:EmptyListBox.ItemTemplate>
</my:EmptyListBox>

コードビハインド:

    ClientModel ClientInfo { get; set; }

    public ClientView()
    {
        ClientInfo = new ClientModel();
        ClientInfo.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(DataReady);

        DataContext = ClientInfo
    }

ClientModel クラス:

public class ClientModel : INotifyPropertyChanged
{
    MyData _myData;
    public MyData MyData 
    {
        get
        {
            return _myData;
        }

        set
        {
            _myData = value;
            NotifyPropertyChanged("MyData");
        }
    }

    public void GetClient(int id)
    {
        // fetch the network for data
    }
}   

問題を示す解決策の .ZIP へのリンク

http://rapidshare.com/files/455900509/WindowsPhoneDataBoundApplication1.zip
4

5 に答える 5

1

新しいItemSourceはDependencyPropertyである必要があります。Bindingsで機能しているものはすべて、DependencyPropertyである必要があります。単にDependencyPropertyにします。

于 2011-04-06T19:54:16.877 に答える
1

私が求める解決策は次のようなものだと思います:

  1. 新しい表示状態グループItemsStatesと 2 つの表示状態NoItemsHasItemsを定義します。
    1. カスタム リストボックスの ControlTemplate で、「データなし」状態のビジュアル ツリーを追加します。
    2. NoItems状態で、「Visibilityデータなし」要素の をVisibleに設定しVisibility、デフォルトの を に設定ItemsPresenterしますCollapsed
    3. HasItems状態で、これらVisibilityの要素を交換します。
    4. オーバーライドでは、デフォルトでEmptyOnApplyTemplate状態に切り替えます。VisualStateManager.GoToState(this, "Empty", true);
    5. OnItemsChangedオーバーライドでは、項目ソースが空であるかどうかを確認し、それに応じてこれらの状態を切り替えるために使用しVisualStateManagerます。

それはうまくいくはずです:)

于 2011-04-10T13:10:15.117 に答える
0

ItemsSource を として作成しますDependencyProperty

例:

 public IEnumerable ItemsSource
 {
   get { return (IEnumerable)base.GetValue(ItemsSourceProperty); }
   set { base.SetValue(ItemsSourceProperty, value); }
 }

 public static DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register(
            "ItemsSource",
            typeof(IEnumerable),
            typeof(EmptyListBox),
            new PropertyMetadata(null));
于 2011-04-04T14:13:30.183 に答える
0

INotifyPropertyChangedインターフェイスを実装し、ItemsSource に ObservableCollection を使用してみてください。プロパティのセッターで OnPropertyChanged メソッドを呼び出すだけです。

多分これが役立つでしょう。

于 2011-04-04T14:50:15.147 に答える
0

Mode=TwoWay を ItemsSource バインディングに追加してみてください。

<my:EmptyListBox ItemsSource="{Binding Path=MyData, Mode=TwoWay}" Name="myListBox">
    <my:EmptyListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=name}" />
        </DataTemplate>
    </my:EmptyListBox.ItemTemplate>
</my:EmptyListBox>
于 2011-04-04T20:11:30.470 に答える