В моем приложении я использую экземпляр UserControl для отображения содержимого сложного типа, который реализует INotifyPropertyChanged, который является ViewModel, для отображения текущего состояния фоновых процессов. Этот ViewModel доступен для UserControl как DependencyProperty.WPF: привязка к одному сложному элементу
DependencyProperty настраивается красиво, и события с радостью отправляются ViewModel. Однако, похоже, что привязка данных WPF дает мне небольшую головную боль. (Кроме того, я не стал бы считать себя экспертом по WPF, проблема и его решение могут быть простыми, но это ускользает от меня.)
В принципе, все, что я вижу, это «Инициализация» на моем пользовательском интерфейсе, который является Значение по умолчанию DependencyProperty и резервное значение, используемое для привязки. Если я изменил значение DependencyProperty по умолчанию, пользовательский интерфейс отобразит эти значения. Если я удалю значение DependencyProperty по умолчанию (то есть null
), он использует резервные значения.
На самом деле я хотел показать содержимое ViewModel.
Вид модели:
public class ImportInformation : INotifyPropertyChanged
{
/* ... */
}
управления пользователя:
public partial class ImportTab : UserControl
{
public static readonly DependencyProperty ValueProperty = DependencyProperty
.Register("ValueProperty", typeof(ImportInformation), typeof(ImportTab), new PropertyMetadata(new ImportInformation { TaskName = "Initializing...", CurrentTask = "Initializing...", Progress = Double.NaN }));
public ImportInformation Value
{
get { return (ImportInformation)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public ImportTab()
{
InitializeComponent();
}
}
XAML:
<UserControl x:Class="LingImp.Tabs.ImportTab"
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:conv="clr-namespace:LingImp.Converters"
mc:Ignorable="d" Name="root"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<conv:NaNConverter x:Key="nanConv"/>
</UserControl.Resources>
<StackPanel Orientation="Vertical">
<TextBlock Padding="0,4,0,4" TextWrapping="Wrap">
Your import is currently being processed. Depending on the data source, this can take a long, <Italic>long</Italic> time.
</TextBlock>
<GroupBox VerticalAlignment="Top" HorizontalAlignment="Left" MinWidth="150" DataContext="{Binding ElementName=root, Path=Value}">
<GroupBox.Header>
<TextBlock FontWeight="Bold" Text="{Binding Path=TaskName, Mode=OneWay, FallbackValue=Initializing...}"/>
</GroupBox.Header>
<StackPanel Orientation="Vertical" Margin="4">
<TextBlock TextWrapping="Wrap" Text="{Binding Path=CurrentTask, Mode=OneWay, FallbackValue=Initializing...}"
Margin="0,0,0,2"/>
<ProgressBar MinHeight="9" HorizontalAlignment="Stretch" Minimum="0" Maximum="1"
IsIndeterminate="{Binding Path=Progress, Mode=OneWay, FallbackValue=true, Converter={StaticResource nanConv}}"
Value="{Binding ElementName=root, Path=Value.Progress, Mode=OneWay, FallbackValue=0}"/>
<TextBlock FontSize="11" HorizontalAlignment="Right"
Text="{Binding Path=Progress, Mode=OneWay, FallbackValue=0, StringFormat=\{0:P\}}"/>
</StackPanel>
</GroupBox>
</StackPanel>
</UserControl>
1. Создают ли ваши сеттеры в 'ImportInformation' событие' PropertyChanged'? 2. Как вы обновляете свою ImportInformation? 3. Появляется ли в окне «output» Visual Studio какие-либо ошибки привязки? – Heinzi
Извините, если я пропустил этот класс. Я думал, что будет слишком долго и скучно публиковать :-) Но да, событие срабатывает должным образом, когда другой фоновый поток устанавливает свои значения. Однако я заметил, что никто не подписался на событие PropertyChanged, поэтому я предполагаю, что проблема заключается в моем фрагменте XAML. – Manny