2

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

我目前正在创建一个小控件来管理正在处理的文件,然后上传到服务。控件现在很简单,只显示文件名和路径。它最终会变得更加复杂,所以我现在想把绑定放下。

问题是,尽管 UploadFiles 已正确绑定并且 FullName 按预期工作(显示 FileInfo.FullName 道具),但我无法从列表视图绑定到控件。理想情况下,我想绑定到 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));
    }
}

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

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

4

2 回答 2

0

DataContextUserControl从它的父级继承的。因此,在 UserControl 中,您不需要指定“文件”。dataContext 已经是选定的文件。

<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 Name, FallbackValue='File Name'}" />
    <TextBlock FontSize="10" FontStyle="Italic" Foreground="Gray" Text="{Binding FullName, FallbackValue='x:\\file\\path\\here'}" />

    <!--<TextBlock FontWeight="Bold" Foreground="{StaticResource PrimaryColorBrush}" Text="{Binding Name, FallbackValue='File Name'}" />-->
</StackPanel>
于 2018-09-25T13:18:01.340 回答
0

此标记要求您添加一个调用控件的依赖项属性:FileControlUploadDataItem

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

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

this.DataContext = new UploadDataViewModel();

你真的不需要UploadDataViewModel这里。该File属性属于该控件并绑定到相同FileInfo的源集合ListViewItemTemplate。然后ControlUploadDataItem控件可以绑定它自己的File依赖属性的属性。

于 2018-09-25T13:38:12.100 回答