[英]Custom Control binding issue (Windows universal 10)
我正在嘗試將自定義控件的參數綁定到列表。 但是,它在錯誤的ViewModel中搜索。 它在控件的ViewModel(ViewModelUserControlVM)中搜索,而不在控件所在頁面的ViewModel中搜索。
用戶控制xaml
<UserControl.DataContext>
<vm:ViewModelUserControlVM/>
</UserControl.DataContext>
<ListView Name="lst">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
用戶控制碼后面
public object ItemsSource
{
get
{
return (object)GetValue(ItemsSourceProperty);
}
set
{
SetValue(ItemsSourceProperty, value);
}
}
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register
(
"ItemsSource",
typeof(object),
typeof(FlipListview),
new PropertyMetadata(
new object(),
new PropertyChangedCallback(OnItemsSourceChanged)
)
);
主頁xaml
<local:CustomControl ItemsSource="{Binding list, Mode=TwoWay}">
編輯
mainpage.xaml
<Page.DataContext>
<vm:MainPageVM/>
</Page.DataContext>
MainPageVM
public class MainPageVM : ViewModelBase
{
public List<Model> list { get; set; }
public RelayCommand SelectedItemCommand { get; set; }
public Model SelectedItem { get; set; }
public MainPageVM()
{
SelectedItem = new Model();
SelectedItemCommand = new RelayCommand(SelectedItem);
list = new List<Model>();
for (int i = 0; i < 5; i++)
{
list.Add(new Model("url" + i, "title" + i, "desc" + i));
}
RaisePropertyChanged(() => list);
}
}
用戶控制碼后面
public CustomControl()
{
this.InitializeComponent();
}
提前致謝。
也許它將像這樣工作:
<local:CustomControl ItemsSource="{x:Bind ViewModel.list, Mode=TwoWay}">
您可以在此處找到有關x:Bind的其他信息
如果您的UserControl的DataContext是ViewModelUserControlVM,則其中的任何綁定都將查找該DataContext。 如果您需要一個父控件綁定到依賴項屬性以從其(父控件)DataContext傳遞某些信息,則可以將UserControls主面板(Grid,StackPanel等)的DataContext設置為ViewModelUserControlVM。 這將導致控件本身在可視樹中“向上”查找以找到DataContext。 在這種情況下,您的MainPage的視圖模型。
通過共享的部分代碼,您似乎試圖將ItemsSource依賴項屬性綁定到MainPage中的某些內容,然后通過將整個UserControl的DataContext分配給另一個視圖模型來覆蓋UserControl的DataContext。
更完整的代碼將支持或反對這一理論。
在下面更新
感謝您提供其他代碼。 最終目標是什么還不清楚,例如,提到了所選項目,但並未使用,我們也不知道用戶控件的視圖模型的相關性。 因此,我匯總了一些內容,這些內容僅在主視圖模型中顯示一個列表,並綁定到正在尋找該類型列表的usercontrol上。 我希望它能幫助您找到想要去的地方...(注:我使用了MVVMLight庫)
MainPageVM:
public class MainPageVM : ViewModelBase
{
private List<Model> _list = new List<Model>();
public List<Model> list
{
get { return _list; }
set { Set(ref _list, value); }
}
public MainPageVM()
{
for (int i = 0; i < 5; i++)
{
list.Add(new Model("url" + i, "title" + i, "desc" + i));
}
RaisePropertyChanged(() => list);
}
}
MainPage xaml(DataContext是MainVM):
<Page
x:Class="App8.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App8"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.DataContext>
<local:MainPageVM />
</Page.DataContext>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<local:CustomControl ItemsSource="{Binding list, Mode=OneWay}" />
</Grid>
</Page>
后面的CustomControl代碼(請注意ctor中的datacontext設置-控件的DataContext正在使用它,但是LayoutRoot網格內的控件將使用控件的依賴項屬性):
public CustomControl()
{
this.InitializeComponent();
LayoutRoot.DataContext = this;
}
public List<Model> ItemsSource
{
get { return (List<Model>)GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
// Using a DependencyProperty as the backing store for ItemsSource. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(List<Model>), typeof(CustomControl), new PropertyMetadata(null, new PropertyChangedCallback(OnItemsSourceChanged)));
private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
}
CustomControl xaml:
<UserControl
x:Class="App8.CustomControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App8"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<Grid x:Name="LayoutRoot">
<ListView Name="lst" ItemsSource="{Binding ItemsSource, Mode=OneWay}"
DisplayMemberPath="Url">
</ListView>
</Grid>
</UserControl>
簡而言之,ListView的itemsource綁定到任何CustomControl的ItemsSource依賴項屬性。 CustomControl的ItemsSource的DataContext就是使用該控件的DataContext。 希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.