1

私のウィンドウの XAML は次のようになります。

<Window x:Class="Binding1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Cronjobs" Height="350" Width="525">
    <Grid>
        <ListBox HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" ItemsSource="{Binding Cronjobs}" />
    </Grid>
</Window>

表示されているように、ListBoxItemsSourceを現在の のCronjobsプロパティにバインドしますDataContext。DataContext は、コード ビハインドのコンストラクターで以下の ViewModel のインスタンスに設定されます。

public partial class MainWindow : Window
{
    private CronjobViewModel cronjobViewModel;

    public MainWindow()
    {
        InitializeComponent();
        this.cronjobViewModel = new CronjobViewModel();
        this.DataContext = cronjobViewModel;
    }
}

ビューモデルは次のようになります。

class CronjobViewModel : DependencyObject
{
    public ObservableCollection<Cronjob> Cronjobs;

    public CronjobViewModel( )
    {
        this.Cronjobs = new ObservableCollection<Cronjob>();
        this.Cronjobs.Add( new Cronjob() );
        this.Cronjobs.Add( new Cronjob() );
    }
}

すばやく簡単にデバッグするために、いくつかのアイテムをコレクションに手動で追加します。そのCronjobクラスは、いくつかの単純な文字列プロパティを持つクラスにすぎず、本質的な部分に切り詰められた実際のモデルです。

class Cronjob {
    private string name;
    public string Name { get { return this.name; } set { this.name = value; } }
    public Cronjob( ) { this.Name = "Herp"; }
}

私は主に Web 開発の経験があり、WPF と MVVM の組み合わせは初めてです。これを理解するのに10時間近く費やしましたが、まだ原因がわかりません。DataGridも試しました。MVVM に関するJason Dolingers のビデオの前半を3 回ほど見て、どのように実行したかを詳しく調べましたが、MVVM の抽象的な概念は理解していても、うまくいきません。そこにあるはずの XAML で意図せず何かを省略しただけだと確信していますが、表示プロパティ名と項目テンプレートをいじっても役に立ちませんでした (インターネットのあちこちで見つけたものによると、それらは必要でさえありません)。このコードでエラーが表示される人はいますか?

大きなコード ダンプで申し訳ありませんが、「退屈な」部分をよりコンパクトな方法でフォーマットしました。

4

2 に答える 2

6

Cronjobsはフィールドであり、フィールドにバインドできないためです。それをプロパティに変更してみてください:

public ObservableCollection<Cronjob> Cronjobs { get; set; }
于 2013-07-19T08:02:29.203 に答える
0

これはうまくいくはずです;)

    public class CronjobViewModel
    {
        public ObservableCollection<Cronjob> Cronjobs { get; private set; }

        public CronjobViewModel()
        {
            this.Cronjobs = new ObservableCollection<Cronjob>();
            this.Cronjobs.Add(new Cronjob());
            this.Cronjobs.Add(new Cronjob());
        }
    }
于 2013-07-19T08:03:40.683 に答える