依存関係の拡大と同等の特性 WPFの ラベルの元のプロパティのリストを、そしてあなたがWPFバインディング機能を使用することができますが、非常に便利なように記述することができ、ユーザーは、制御コードの再利用の方法は同等であり、これらの点は、個別に理解することは非常に簡単です。しかし、MVVMパターンを使用するには、またはのいくつかを探索します。
私たちは、最初のStackPanelを入れてユーザーコントロール(UC_FoodsPanel.xaml)を、作成します。
<UserControl x:Class="Note.UC_FoodsPanel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <StackPanel x:Name="SpFoods" MinWidth="620"/> </UserControl>
然后在其后台添加依赖属性相关代码:
C#
public List<UC_FoodItem> Items { get => (List<UC_FoodItem>)GetValue(ItemsProperty); set => SetValue(ItemsProperty, value); } // Using a DependencyProperty as the backing store for Items. This enables animation, styling, binding, etc... public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(nameof(Items), typeof(List<UC_FoodItem>), typeof(UC_FoodsPanel), new PropertyMetadata(null, PropertyChangedCallback, null)); private static void PropertyChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs args) { if (args.NewValue is List<UC_FoodItem> newValue) { try { var control = obj as UC_FoodsPanel; control.SpFoods.Children.Clear(); foreach (var item in newValue) { control.SpFoods.Children.Add(item); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); MessageBox.Show($"载入数据出错:{ex.Message}"); } } }
「コンテンツのオンラインリファレンス関連の依存の属性-コントロールは、依存関係プロパティを追加する-の方を見ている- WPFシリーズはブログパーク、」テキストは、メソッドを追加するプロパティを頼っている-入力propdpその後、Tabキーをダブルクリックします。
上記のコードは、私たちがアイテムに依存関係プロパティを追加し、UC_FoodItemクラスの一覧です。キーパラメータを制御するコールバック関数PropertyChangedCallbackプロパティが変更は、結合特性objを表す場合、ここ即ちUC_FoodsPanel、引数パラメータとがOldValueプロパティnewValueは、前と属性変更後の値を表すことです。変更が値をとる、すなわち場所 - リスト - ユーザ制御のStackPanelに割り当てられています。
あなたがのItemsプロパティを使用することができたときに、この後、我々は他のページ(ビュー\\ MainWindowView.xaml)で、このユーザーコントロールを使用します。
XHTML
<note:UC_FoodsPanel Items="{Binding Items}"></note:UC_FoodsPanel>
然后在这个页面的 ViewModel 中(ViewModels\\MainWindowViewModel.cs)设置需要绑定的值:
private List<UC_FoodItem> _items = new List<UC_FoodItem>(); public List<UC_FoodItem> Items { get => _items; set => SetProperty(ref _items, value); } protected void LoadFoods() { try { DataTable dt = _sqliteHelper.RunToDataSet("select * from Notes order by ID desc").Tables[0]; var items = new List<UC_FoodItem>(); foreach (DataRow row in dt.Rows) { UC_FoodItem foodItem = new UC_FoodItem(); foodItem.lab_id.Content = row["ID"].ToString(); foodItem.lab_foodName.Content = row["Title"].ToString(); foodItem.lab_foodPrice.Content = row["Type"].ToString(); foodItem.lab_foodIntro.Content = row["Content"].ToString(); items.Add(foodItem); } Items = items; } catch (Exception ex) { Console.WriteLine(ex); MessageBox.Show($"载入数据出错:{ex.Message}"); } }
ここでビューモデルINotifyPropertyChangedのモードを使用して、結合特性をプリズム(VM BindableBaseクラスを継承)書かれたフレームを使用することです。ここでは、新しいローカル変数項目は、アイテムに割り当てられた唯一の完全なデータを埋める気づいたことをトリガすることができない性質(PropertyChangedCallback)の状態を変更、そうではないので、これは、余分ではありません。
最後にではなく、少なくとも次のとおりです。ユーザーコントロールは非常にシンプルなので、なぜそれを直接書き込むページのプロパティの使用を含め、内部の内容に依存しませんか?そして、そのため、MVVMのために
理由モード、DataContextのページは見つけることができません、その後のDataContext依存関係プロパティの背景に書き、関連するViewModelにに指定されています。