2010-06-28 3 views
0

В моем приложении я использую экземпляр 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

1. Создают ли ваши сеттеры в 'ImportInformation' событие' PropertyChanged'? 2. Как вы обновляете свою ImportInformation? 3. Появляется ли в окне «output» Visual Studio какие-либо ошибки привязки? – Heinzi

+0

Извините, если я пропустил этот класс. Я думал, что будет слишком долго и скучно публиковать :-) Но да, событие срабатывает должным образом, когда другой фоновый поток устанавливает свои значения. Однако я заметил, что никто не подписался на событие PropertyChanged, поэтому я предполагаю, что проблема заключается в моем фрагменте XAML. – Manny

ответ

1
public static readonly DependencyProperty ValueProperty = DependencyProperty  
     .Register("Value", ...);  
... 
<TextBlock 
    ... 
    Text="{Binding ElementName=root, ...}"/> 
    ... 
0

Мой плохо. Я зарегистрировал DependencyProperty неправильно:

public static readonly DependencyProperty ValueProperty = DependencyProperty 
     .Register("ValueProperty", typeof(ImportInformation), typeof(ImportTab)); 

... должен читать ...

public static readonly DependencyProperty ValueProperty = DependencyProperty 
     .Register("Value", typeof(ImportInformation), typeof(ImportTab)); 

Это, конечно, установил ее. Спасибо в любом случае :-)

Смежные вопросы