【问题标题】:Binding data to a ListView inside user control (UWP)将数据绑定到用户控件 (UWP) 内的 ListView
【发布时间】:2020-05-18 06:50:02
【问题描述】:

我有一个这样的用户控件

  <Grid>
    <ListView SelectionMode="Multiple" x:Name="lview"  ItemsSource="{x:Bind ItemsSource, Mode=OneWay}" DisplayMemberPath="{x:Bind DisplayMemberPath}"  ></ListView>
</Grid>

后面的代码

 public sealed partial class UserCntrl : UserControl
{
    public UserCntrl()
    {
        this.InitializeComponent();
    }

    public static readonly DependencyProperty ItemsSourceProperty =
     DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(UserControl),
         new PropertyMetadata(null));

    public IEnumerable ItemsSource
    {
        get => (IEnumerable)GetValue(ItemsSourceProperty);
        set => SetValue(ItemsSourceProperty, value);
    }

    public string DisplayMemberPath
    {
        get { return (string)GetValue(DisplayMemberPathProperty); }
        set { SetValue(DisplayMemberPathProperty, value); }
    }

    public static readonly DependencyProperty DisplayMemberPathProperty =
    DependencyProperty.Register("DisplayMemberPath", typeof(string), typeof(UserControl), new PropertyMetadata(""));

}

主页代码

  <local:UserCntrl x:Name="lview"   Loaded="EditTextControl_Loaded"></local:UserCntrl>

后面的代码

 public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
    }

    private void EditTextControl_Loaded(object sender, RoutedEventArgs e)
    {
        ObservableCollection<OptionItem> io = new ObservableCollection<OptionItem>();

        io.Add(new OptionItem { Name = "11111111111" });
        lview.ItemsSource = io;
        lview.DisplayMemberPath = "Name";

    }
}

public class OptionItem 
{
    private string _Name = string.Empty;
    public string Name
    {
        get { return _Name; }
        set { _Name = value;  }
    }

}

这给出了这样的输出

如何使此控件显示它包含的正确项目,而不是模型的名称。 完整代码可在here 获得。 注意:我无法编辑模型或向 ObservableCollection 添加内容的方式。我必须通过编辑 UC 来完成这项工作

【问题讨论】:

  • 尝试在您的 UserControl 构造函数中添加this.DataContext = this
  • @Eldar 尝试不工作

标签: c# xaml uwp observablecollection


【解决方案1】:

只需使用 ItemTemplate 即可:

<ListView...>
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{x:Bind Name}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

当涉及到如何显示项目时,它为您提供了极大的灵活性:)

编辑:尝试为ItemTemplate定义依赖属性

public DataTemplate ItemTemplate
{
    get { return (DataTemplate)GetValue(ItemTemplateProperty); }
    set { SetValue(ItemTemplateProperty, value); }
}

public static readonly DependencyProperty ItemTemplateProperty =
    DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(UserControl));

【讨论】:

  • 对我来说,这可能是不可能的。我正在创建一个通用用户控件。这样它就可以接受不同类型的 IEnumerable 作为 Itemsource。在每个itemssource中,作为要绑定的字段,不能在用户控件中设置。该数据需要通过依赖属性来自父页面。这就是我使用 DisplayMemberPath 的原因
  • @None 然后定义ItemTemplate 属性而不是DisplayMemberPath :)
  • 我已经这样试过了,显示为空。
  • @None 抱歉,我使用 WPF Binding 而不是 x:Bind :) 尝试更改它。
  • 无效的绑定路径“DisplayMemberPath”:在类型“DataTemplate”上找不到属性“DisplayMemberPath”。这就是我得到的 x:bind
【解决方案2】:

正如@Michał Turczyn 所说,您可以将数据模板更改为Text="{x:Bind}" 即可。

【讨论】:

  • 在不使用 ItemTemplate 的情况下有没有其他方法可以让它工作。我的方法对我来说看起来是正确的,但我无法理解我在这里做错了什么
  • 也许你可以给出你想要的东西的完整描述,即最终的结果。然后我们可以找到是否有其他方法。
猜你喜欢
  • 2017-05-16
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
相关资源
最近更新 更多