0

データベースで使用可能なすべてのテーブルのメニューを表示するために、Fluent リボンを使用してドロップダウン ボタンを作成しようとしています。メニューは、データベースから TablesList に取得された List を使用して生成され、その後、ドロップダウン ボタンの itemssource にバインドされます。

これまでのところ、メニューが生成され、テーブル名が正しく表示されています。

現在のメニューアイテムのヘッダーを取得し、それを使用して正しいテーブルをロードするコマンド LoadTableCommand を使用して、すべてのメニューアイテムを CurrentTable にロードするコマンドにバインドします。

ここで問題が発生し、コマンドが実行されず、エラーや、これが発生している (または発生していない) 理由の手がかりが得られないようです。

今考えられる唯一のことは、ビューモデル自体にコマンドをバインドしてから、それを ItemsSource に割り当てることですが、お気に入りの検索エンジンが解決策を見つけていないため、これを行う方法をまだ見つけていません。自分..

PS: DataManager クラスは正しく動作します。

ここで私がどこで間違っているのか、誰にも分かりますか?

いつものように、どんな助けも大歓迎です;)

MainWindow.xaml

...
                <Fluent:DropDownButton Header="Table"
                                       ItemsSource="{Binding TablesList}">
                    <Fluent:DropDownButton.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="Command" Value="{Binding LoadTableCommand}" />
                            <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
                        </Style>
                    </Fluent:DropDownButton.ItemContainerStyle>
                </Fluent:DropDownButton>
...

MainViewModel.cs

...
    private DataManager dataManager = new DataManager("Data Source=db.sqlite");


    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        TablesList = dataManager.GetTables();
        CurrentTable = dataManager.GetTable("PriceList");
    }

    /// <summary>
    /// The <see cref="TablesList" /> property's name.
    /// </summary>
    public const string TablesListPropertyName = "TablesList";

    private List<string> _tablesList = new List<string>();

    /// <summary>
    /// Sets and gets the TablesList property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public List<string> TablesList
    {
        get
        {
            return _tablesList;
        }

        set
        {
            if (_tablesList == value)
            {
                return;
            }

            RaisePropertyChanging(TablesListPropertyName);
            _tablesList = value;
            RaisePropertyChanged(TablesListPropertyName);
        }
    }

    /// <summary>
    /// The <see cref="CurrentTable" /> property's name.
    /// </summary>
    public const string CurrentTablePropertyName = "CurrentTable";

    private DataTable _currentTable = new DataTable();

    /// <summary>
    /// Sets and gets the CurrentTable property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public DataTable CurrentTable
    {
        get
        {
            return _currentTable;
        }

        set
        {
            if (_currentTable == value)
            {
                return;
            }

            RaisePropertyChanging(CurrentTablePropertyName);
            _currentTable = value;
            RaisePropertyChanged(CurrentTablePropertyName);
        }
    }

    private RelayCommand<string> _loadTable;

    /// <summary>
    /// Gets the LoadTableCommand.
    /// </summary>
    public RelayCommand<string> LoadTableCommand
    {
        get
        {
            return _loadTable
                ?? (_loadTable = new RelayCommand<string>(
                                      table => LoadTable(table)));
        }
    }

    private void LoadTable(string name)
    {
        Console.WriteLine(name);
        // CurrentTable = dataManager.GetTable(name);
    }
...
4

1 に答える 1

1

TablesList は文字列のリストです。文字列にはプロパティ LoadTableCommand がありません。そのため、コマンド バインディングを修正する必要があります。エレメント バインディングまたは RelativeSource バインディングを使用して、ツリーを正しいデータ コンテキストまで上っていきます。

于 2013-05-30T07:35:03.493 に答える