Tasks
のリストにバインドされたItemsControlがあります。そしてそのモデルTask
をそのビューTaskView
とviewmodel TaskViewModel
に与えたいと思います。WPF/MVVM:ItemsControlのview/viewmodelにモデルをバインドする方法
私はそのようなビューのプロパティに値をバインドしようとしています
<views:TaskView Model="{Binding}" />
そしてビューとビューモデルの間で値をバインドします。それは動作しません。しかし
public partial class TaskView
{
public TaskView()
{
InitializeComponent();
// Attempt to bind view.IdProperty with viewmodel.Id
var binding = new Binding("Id");
SetBinding(IdProperty, binding);
}
public Task Model
{
get { return GetValue(ModelProperty) as Task; }
set { SetValue(ModelProperty, value); }
}
public static readonly DependencyProperty ModelProperty =
DependencyProperty.Register("Model", typeof(Task), typeof(TaskView));
}
。私はC#/ .NETの初心者であるため、私が正しい方向にいるかどうかは分かりません。なぜなら、それは一般的な問題のIMOにとっては複雑に思われるからです。
ItemsControlが期待どおりに動作するように、タスクの一覧が正しくレンダリングされることに注意してください。
質問:
- データソースからの眺めを構築し、そのビューにモデルを渡す方法は? (上で説明した問題)
- そのモデルからビューに値を読み込む方法は? (TaskView.xamlを参照してください)
- これを行うのより慣用な方法はありますか?
モデル
namespace Models { public class Task { public string Id { get; set; } public Status Status { get; set; } // And other properties ... } }
リスト(親)
のViewModel
012:ここで
は重要な部分です
ビュー
<ItemsControl x:Name="Tasks"
Grid.Row="1"
Grid.ColumnSpan="2"
ItemsSource="{Binding Path=Tasks, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="models:Task">
<!-- TODO : Bind model to task view/viewmodel -->
<views:TaskView Model="{}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
タスク(子)
TaskView.xaml.cs
public partial class TaskView
{
public TaskView()
{
InitializeComponent();
}
public Task Model
{
get { return GetValue(ModelProperty) as Task; }
set { SetValue(ModelProperty, value); }
}
public static readonly DependencyProperty ModelProperty =
DependencyProperty.Register("Model", typeof(Task), typeof(TaskView));
}
TaskView.xaml
<UserControl>
<UserControl.DataContext>
<viewModels.TaskViewModel />
</UserControl.DataContext>
<Border>
<!-- TODO : Read model attributes -->
<Grid Background="{Binding Path=Model.Status, Converter={StaticResource StatusBackgroundColourConverter}}">
<!-- ... -->
</Grid>
</Border>
</UserControl>
TaskVi ewModel
class TaskViewModel : ActionViewModelBase
{
public Task Model { get; set; }
// ...
}
多分私は使用しているパターンを認識しませんが、MVVMを使って、モデルからビューモデルを作成するのではなく、ビューモデルからviewmodelを作成しないでください。 – grek40
@ grek40それは私によく見えません。 MVVMパターンによれば、モデルはViewModelについての知識を持ってはならず、ViewModelはViewについて知ってはいけません。 MSDNのドキュメントから取得した画像を参照してください。https://i-msdn.sec.s-msft.com/dynimg/IC564167.png – basgys
画像を見て、ビューとモデルの間に直接の接続はありません。モデルはviewmodelについて知らないが、viewmodelはモデルについて知っているので、 'new viewmodel(modelData)'のようなものを言うことは合法です。これは、ビューモデルとビューに似ています。 – grek40