0

コンボボックスにいくつかのデータ型を表示したい。データ型は次のクラスにラップされます。

public class TDataTypeBinder: INotifyPropertyChanged
{
    private string name;
    public string Name
    {
        get
        {
            return name ;
        }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    private DataType datatype;
    public DataType Datatype
    {
        get
        {
            return datatype;
        }
        set
        {
            datatype = value;
            OnPropertyChanged("Datatype");
        }
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="TDataTypeBinder"/> class.
    /// </summary>
    /// <param name="valueToSelect">The value to select.</param>
    public TDataTypeBinder(string valueToSelect)
    {
        Name = valueToSelect;
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propName)
    {
        PropertyChangedEventHandler eh = this.PropertyChanged;
        if (null != eh)
        {
            eh(this, new PropertyChangedEventArgs(propName));
        }
    }

}

現在、私はバインディングのプロパティを持っています:

public CollectionView DatatypesDisplayed
    {
        get
        {

            List<TDataTypeBinder> list = new List<TDataTypeBinder>();
            list.Add(new TDataTypeBinder("String"));
            list.Add(new TDataTypeBinder("Float"));
            list.Add(new TDataTypeBinder("Integer"));

            myDatatypes = new CollectionView(list);
            return myDatatypes;
        }
    }

これは、WorkflowElement で xaml 経由で接続されます。

<... WorkflowViewElement ...
<ComboBox Name="gType" ItemsSource="{Binding Path=ModelItem.DatatypesDisplayed }" DisplayMemberPath="Name" Margin="3" MinWidth="150" Height="20" />

コンボボックスには何もありませんgType。私は何を間違えましたか?私は WPF とワークフロー 4.0 が初めてなので、これは難しいことではないと思います。

アドバイスありがとう、エル

4

1 に答える 1

0

UI が最初にバインドされたときに DatatypesDisplayed コレクションが null の場合、その後の変更はビューに通知されません...CollectionViewクラスのコンストラクターで初期化していますか?

また、ビューDataContextをクラスのインスタンスに設定していることを再確認してください...

乾杯、イアン

編集:

OK - コンボボックスを定義している xaml の次の行を見てください。

<ComboBox Name="gType" ItemsSource="{Binding Path=ModelItem.DatatypesDisplayed }" DisplayMemberPath="Name" Margin="3" MinWidth="150" Height="20" />

これは、コンボ ボックスに表示される「もの」が DataTypesDisplayed というコレクションに存在する必要があることを意味します。これは、DisplayMemberPath にこれを使用しているため、そのオブジェクトが「Name」というプロパティを公開している限り、任意の種類のオブジェクトのコレクションにすることができます。さらに、このコレクションはModelItemと呼ばれるもののプロパティである必要があり、ModelItemはビューのDataContextであるもののプロパティである必要があります...

すべてをまとめると、次のようになると思います。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        // Set the View's DataContext to be an instance of the class that contains your CollectionView...
        this.DataContext = new MainWindowViewModel();
    }
}


public class MainWindowViewModel
{
    public MainWindowViewModel()
    {
    }

    public object ModelItem { get; set; }
}

public class ModelItem
{
    public CollectionView DataTypesDisplayed { get; set; }
}

ItemsSource Binding の Path に ModelItem がある理由がよくわかりません。それが必要ないことに気付くかもしれません - CollectionView を ViewModel に直接配置するだけです...

于 2009-11-26T21:26:49.077 に答える