7

Northwindの顧客の値を挿入/更新/削除する簡単なフォームを作成しました。結果を表示するには、結果を閉じてから再度開く必要があることを除いて、すべて正常に機能します。私のフォームは次のようになります:

ここに画像の説明を入力してください

更新する方法について何十もの記事を検索しましListBoxたが、それらはすべて、インターフェースの実装、またはDataSetの使用、および私が聞いたことがなく、実装できないものを使用しています。これは非常に単純なプロジェクトであり、簡単な手順を使用しています。多くのコード行を追加せずに顧客のリストを更新する簡単な方法はありますか?

4

4 に答える 4

30

簡単な答えは次のとおりです。myListBox.Items.Refresh();

于 2017-02-23T21:21:02.390 に答える
10

使用ObservableCollectionしていて、モデルにINotifyPropertyChangedこれら2つの実装がありますか?変更があれば、ListBoxが自動的に更新されます。リストを明示的に更新する必要はありません。

ObservableCollectionこれはとを使用した小さな例ですINotifyPropertyChanged。明らかに、データベースからObservableCollectionにデータを入力しますSQL

窓:

public partial class MainWindow : Window,  INotifyPropertyChanged
{
    private ObservableCollection<MyModel> _list = new ObservableCollection<MyModel>();
    private MyModel _selectedModel;

    public MainWindow()
    {
        InitializeComponent();
        List.Add(new MyModel { Name = "James", CompanyName = "StackOverflow"});
        List.Add(new MyModel { Name = "Adam", CompanyName = "StackOverflow" });
        List.Add(new MyModel { Name = "Chris", CompanyName = "StackOverflow" });
        List.Add(new MyModel { Name = "Steve", CompanyName = "StackOverflow" });
        List.Add(new MyModel { Name = "Brent", CompanyName = "StackOverflow" });
    }

    public ObservableCollection<MyModel> List 
    {
        get { return _list; }
        set { _list = value; }
    }

    public MyModel SelectedModel
    {
        get { return _selectedModel; }
        set { _selectedModel = value; NotifyPropertyChanged("SelectedModel"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

Xaml

<Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Name="UI">
    <Grid>
        <ListBox ItemsSource="{Binding ElementName=UI, Path=List}" SelectedItem="{Binding ElementName=UI, Path=SelectedModel}" Margin="0,0,200,0" DisplayMemberPath="DisplayMember" SelectedIndex="0" />
        <StackPanel HorizontalAlignment="Left" Height="100" Margin="322,10,0,0" VerticalAlignment="Top" Width="185">
            <TextBlock Text="Name" />
            <TextBox Height="23" TextWrapping="Wrap" Text="{Binding ElementName=UI, Path=SelectedModel.Name, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock Text="Company Name" />
            <TextBox Height="23" TextWrapping="Wrap" Text="{Binding ElementName=UI, Path=SelectedModel.CompanyName, UpdateSourceTrigger=PropertyChanged}" />
        </StackPanel>
    </Grid>
</Window>

モデル

public class MyModel : INotifyPropertyChanged
{
    private string _name;
    private string _companyName;

    public string Name
    {
        get { return _name; }
        set { _name = value; NotifyPropertyChanged("Name"); }
    }

    public string CompanyName
    {
        get { return _companyName; }
        set { _companyName = value; NotifyPropertyChanged("CompanyName"); }
    }

    public string DisplayMember
    {
        get { return string.Format("{0} ({1})", Name, CompanyName); }

    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
            PropertyChanged(this, new PropertyChangedEventArgs("DisplayMember"));
        }
    }
}

この場合、プロパティを編集すると、リストが即座に更新され、新しいアイテムが追加/削除されたときにも更新されます。

ここに画像の説明を入力してください

于 2012-12-31T02:01:28.473 に答える
3

ListBox.UpdateLayoutを呼び出すのはどうですか?

もちろん、ToStringメソッドから更新された文字列を返すように、特定のアイテムを更新する必要もあります。

更新: ListBox.UpdateLayoutを呼び出す前に、ListBox.InvalidateArrangeも呼び出す必要があると思います。

于 2012-12-31T01:15:40.817 に答える
0

INotifyPropertyChangedを使用するのが最善の方法であり、リスト全体を更新することはお勧めできません。
正面玄関:

public partial class MainWindow : Window
{
    private BindingList<FoodModel> foodList = new BindingList<FoodModel>();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        foodList.Add(new FoodModel { foodName = "apple1" });
        foodList.Add(new FoodModel { foodName = "apple2" });
        foodList.Add(new FoodModel { foodName = "apple3" });
        FoodListBox.ItemsSource = foodList;
    }

    private void Button2_Click(object sender, RoutedEventArgs e)
    {
        foodList[0].foodName = "orange";
    }

    private void RefreshButton_Click(object sender, RoutedEventArgs e)
    {
        FoodListBox.Items.Refresh();
    }
}

モデル:

public class FoodModel: INotifyPropertyChanged
{
    private string _foodName;

    public string foodName
    {
        get { return _foodName; }
        set
        {
            if (_foodName != value)
            {
                _foodName = value;
                PropertyChanged(this, new PropertyChangedEventArgs("foodName"));
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

XAML:

 <ListBox HorizontalAlignment="Center" Name="FoodListBox" VerticalAlignment="Top" Width="194" Height="150">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding foodName}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
于 2020-07-07T10:02:01.217 に答える