4

私はWPFを初めて使用しますが、よく検索した結果、皆さんに助けを求めることにしました...

私はクラスを持っています - Location With primary properties as -

場所の名前

ロケーションID

このクラスを WPF のコンボ ボックスにバインドしたいと考えています。データベースから場所リストを取得します。最初のテキスト/値のペアを ---Select One--- / -1としてコンボボックスにリストを表示する必要があります。さて、これまでのところ私はこれを行ってきました -

作成 -

public ObservableCollection<ComboBoxItem> cbLocationList { get; set; }

cbLocationList = new ObservableCollection<ComboBoxItem>();

SelectedcbDefaultLocationListItem = new ComboBoxItem { Content = "---Select One---" , Tag="-1"};

cbLocationList.Add(SelectedcbDefaultLocationListItem);

ループ内のアイテムを次のように埋めます -

foreach (Location loc in LocationtList)
{

 cbLocationList.Add(new ComboBoxItem  { Content = loc.LocationName, Tag=loc.LocationID.ToString() });

}

ここで、XAML でcbLocationListを次のように設定します。

ItemsSource="{Binding cbLocationList}" 

コンボボックスの。これはうまくいきますが、フォームをリセットするときに、コンボ ボックスの値を「-1」にリセットする必要があります。タグプロパティではできません。(私が検索したところ、 ListItemのようなプロパティがないようです)すべてのボディは、クラスにバインドして DisplayMemberPath と SelectedValuePath を設定することを提案しているようです。Locationクラスに直接バインドする場合、 --Select One-- アイテムを挿入するにはどうすればよいですか。ダミー オブジェクトを作成し、バインドする前にそれをリストに挿入することで、これを行うことができます。しかし、これは WPF で作業するための最良の方法です。たぶん、私が見逃しているまったく異なるアプローチがあります。お知らせ下さい。

前もって感謝します。!

4

1 に答える 1

5

より多くの MVVM アプローチでこれを行う方法は次のとおりです。

ビューモデル:

public class MyViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public Location SelectedcbDefaultLocationListItem = new Location { LocationName = "---Select One---", LocationID = -1 };

    public ObservableCollection<Location> LocationList { get; set; }

    private int _selectedLocationID;

    /// <summary>
    /// Get/Set the SelectedLocationID property. Raises property changed event.
    /// </summary>
    public int SelectedLocationID
    {
        get { return _selectedLocationID; }
        set
        {
            if (_selectedLocationID != value)
            {
                _selectedLocationID = value;

                RaisePropertyChanged("SelectedLocationID");
            }
        }
    }        

    /// <summary>
    /// Constructor
    /// </summary>
    public MyViewModel()
    {
        LocationList = new ObservableCollection<Location>();
        LocationList.Add(new Location() { LocationID = 1, LocationName = "Here" });
        LocationList.Add(new Location() { LocationID = 2, LocationName = "There" });

        LocationList.Insert(0, SelectedcbDefaultLocationListItem);

        SelectedLocationID = SelectedcbDefaultLocationListItem.LocationID;
    }

    /// <summary>
    /// Resets the selection to the default item.
    /// </summary>
    public void ResetSelectedItem()
    {
        SelectedLocationID = SelectedcbDefaultLocationListItem.LocationID;
    }

    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }   
}

コードビハインド:

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
    public MyViewModel ViewModel { get; private set; }

    public MainWindow()
    {
        InitializeComponent();

        ViewModel = new MyViewModel();

        DataContext = ViewModel;
    }

    private void ResetButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        ViewModel.ResetSelectedItem();
    }
}

XAML:

<Window xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"  x:Class="StackOverflow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <ComboBox ItemsSource="{Binding LocationList, Mode=OneWay}" DisplayMemberPath="LocationName" SelectedValuePath="LocationID" SelectedValue="{Binding SelectedLocationID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            <Button Click="ResetButton_Click" Content="Reset" Margin="5" HorizontalAlignment="Right" />
        </StackPanel>        
    </Grid>    
</Window>

通常、コード ビハインドでリセット メソッドを呼び出す代わりに、コマンドが使用されます。ただし、完全な MVVM アプローチを使用していないため、これで十分です。

于 2013-09-16T16:27:00.873 に答える