簡體   English   中英

自定義控件綁定問題(Windows Universal 10)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM