如何使用MVVM Light創建一般用戶控件?使用MVVM Light創建一般用戶控件
在應用程序中的所有主視圖似乎工作正常。但是,一般控制似乎並不接受綁定。這是我的FileDiplay
控件。 一個圖標和一個顯示文件名旁邊的TextBlock。
利用
在主視圖中的一個,我試圖綁定一個ItemsControl
的ItemsTemplate
內的文件名。指定文字,如FileName="xxx"
可以正常工作,但綁定不會。
<local:FileLink FileName="{Binding FileName}" />
我一直在DependencyProperty
和INotifyPropertyChanged
很多玩耍。看起來沒有辦法解決DependencyProperty,因爲它不能被綁定。當使用簡單的TextBlock
而不是此用戶控件時,綁定被接受。
我沒有包含定位器或利用控件,以避免代碼太多。事實上,我認爲這是一個非常簡單的問題,我還沒有找到解決方案。我認爲將DataContext設置爲ViewModel是正確的,因爲沒有列表綁定或真正的UserControl分離是可能的。我也調試了setters並嘗試了不同的方法。
FileLink.xaml
<local:UserControlBase
x:Class="....FileLink"
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:..."
mc:Ignorable="d" DataContext="{Binding FileLink, Source={StaticResource Locator}}">
<Grid>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Icon}" Margin="0,0,5,0" />
<TextBlock Text="{Binding FileName}" />
</StackPanel>
</Grid>
</local:UserControlBase>
FileLink.xaml.cs
using System.Windows;
using System.Windows.Media;
namespace ...
{
public partial class FileLink : UserControlBase
{
private FileLinkViewModel ViewModel => DataContext as FileLinkViewModel;
public static DependencyProperty FileNameProperty = DependencyProperty.Register(nameof(FileName), typeof(string), typeof(FileLink));
public ImageSource Icon
{
get
{
return App.GetResource("IconFileTypeCsv.png"); // TODO:...
}
}
public string FileName
{
get
{
return ViewModel.FileName;
}
set
{
ViewModel.FileName = value;
}
}
public FileLink()
{
InitializeComponent();
}
}
}
FileLinkViewModel.cs
using GalaSoft.MvvmLight;
namespace ...
{
public class FileLinkViewModel : ViewModelBase
{
private string _FileName;
public string FileName
{
get
{
return _FileName;
}
set
{
Set(() => FileName, ref _FileName, value);
}
}
}
}
「我確實認爲將DataContext設置爲ViewModel是正確的「。我不這麼認爲。顯式設置UserControl的DataContext實際上總是錯誤的。它可以防止UserControl繼承其父控件的DataContext,這是您通常在使用控件時所期望的內容,例如,乳清你寫'FileName =「{綁定文件名}」'。 – Clemens
但是,這是否意味着屬性名稱必須匹配?我很可能會誤解這一點。當沒有指定DataContext時,如何正確設置屬性? – bytecode77
在UserControl的XAML中,您將使用RelativeSource編寫綁定。看到這裏:http://stackoverflow.com/a/25699347/1136211 – Clemens