c# - WPF 用户控件绑定(bind)

标签 c# wpf data-binding

<分区>

一些背景知识:我正在努力研究 Windows Presentation Foundation 的数据绑定(bind)。我理解其中的大部分内容(或者至少,我认为我理解),但是尝试将数据从父控件绑定(bind)到用户控件让我感到困惑。也感觉互联网上的每个人对此都有不同的方法,这无济于事。

我目前正在创建一个小控件来管理正在处理的文件,然后上传到服务。现在的控件很简单,只显示文件名和路径。它最终会随着复杂性的增加而增长,所以我现在想取消绑定(bind)。

问题是尽管 UploadFiles 被正确绑定(bind)并且 FullName 按预期工作(显示 FileInfo.FullName Prop ),但我无法从 ListView 绑定(bind)到控件。理想情况下,我想绑定(bind)到 ViewModel 的 File 对象,然后从那里开始。

使用控件,其中 UploadFiles 是一个可观察的 FileInfo 列表:

<ScrollViewer VerticalScrollBarVisibility="Auto">
        <ListView ItemsSource="{Binding UploadFiles}" Margin="5">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding FullName}" />
                        <controls:ControlUploadDataItem File="{Binding}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ScrollViewer>

UploadControl XAML(命名空间混淆):

<UserControl x:Class="-----.Controls.ControlUploadDataItem"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:-----.Controls"
         mc:Ignorable="d" 
         d:DesignWidth="300"
         x:Name="UploadDataItem">    
<StackPanel Background="{StaticResource SecondaryColorBrush}" Margin="0, 0, 0, 10">
    <TextBlock FontSize="20" FontWeight="Bold" Foreground="{StaticResource PrimaryColorBrush}" Text="{Binding File.Name, ElementName=UploadDataItem, FallbackValue='File Name'}" />
    <TextBlock FontSize="10" FontStyle="Italic" Foreground="Gray" Text="{Binding File.FullName, ElementName=UploadDataItem, FallbackValue='x:\\file\\path\\here'}" />

    <!--<TextBlock FontWeight="Bold" Foreground="{StaticResource PrimaryColorBrush}" Text="{Binding File.Name, FallbackValue='File Name'}" />-->
</StackPanel>

最后是背后的代码:

/// <summary>
/// Interaction logic for UploadItem.xaml
/// </summary>
public partial class ControlUploadDataItem : UserControl
{

    public ControlUploadDataItem()
    {
        InitializeComponent();
        this.DataContext = new UploadDataViewModel();            
    }
}

internal class UploadDataViewModel: ViewModelBase
{

    private FileInfo _file;

    public FileInfo File
    {
        get { return _file; }

        set
        {
            _file = value;
            // Refresh(); ?
            OnPropChanged(nameof(File));
        }
    }
}

internal class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropChanged(string prop)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
    }
}

我希望这个控件能够处理与上传文件有关的所有事情;也就是说,将文件显示为待处理,正在处理时显示上传栏,完成时显示“最终结果”。

问题是..我做错了什么,绑定(bind)文件数据?

最佳答案

此标记要求您添加 dependency propertyFile 调用到 ControlUploadDataItem 控件:

<controls:ControlUploadDataItem File="{Binding}" />

您还应该避免在控件的构造函数中设置 DataContext 属性,因为这会阻止它从对象树中的父元素继承 DataContext:

this.DataContext = new UploadDataViewModel();

您实际上并不需要此处的 UploadDataViewModelFile属性属于控件,绑定(bind)到ItemTemplateListView源集合中的FileInfo > 相同。 ControlUploadDataItem 控件然后可以绑定(bind)它自己的 File 依赖属性的属性。

关于c# - WPF 用户控件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52499019/

相关文章:

wpf - 这是 Visual Studio 2010 IDE 的错误吗?

wpf - XAML 中绑定(bind)路径属性的串联

c# - MVVM wpf在 View 模型之间传递参数

c# - 如何向 AutoFac 注册需要参数的泛型类?

c# - 通过调度程序/数据绑定(bind)更新 UI 中缺少什么

c# - 将 WPF 验证集成到 MVVM 中

.net - 如何向绑定(bind)的组合框添加空值或自定义值?

wpf - 当由于空值而无法评估绑定(bind)时,使用默认值

c# - 绑定(bind)属性没有 `Exclude` ,有解决办法吗?

c# - 通过 WebRequest 发送文件