2015-01-11 2 views
0

내 모든보기에서 다시 사용할 수있는 사용자 지정 사용자 컨트롤을 만들려고합니다. 내 BaseViewModel에는 ViewAlerts라는 속성이 있습니다.이 속성은 성공적인 업데이트, 실패한 요청 등과 같이 응용 프로그램에서 일관되게 경고를 표시하는 데 사용됩니다. 내 사용자 지정 컨트롤이 빌드 가능하고 바인딩 용 속성이있는 지점에 도달 할 수 있었지만 알림 컬렉션은 표시되지 않습니다. 내가 정적으로 테스트 목적으로 내 기본보기 모델에서 일부 경고를 정의 오전 및 표시하려면 경고를 얻을 수 없습니다 (INotifyPropertyChanged하지만 내 바인딩 가능한 속성 ObservableCollection에서 상속합니다 <> 그래서 자동으로 처리해야합니다 생각한다). 여기 바인딩 가능한 컬렉션이있는 Xaml WinRT 사용자 지정 사용자 컨트롤

지금까지 내 사용자 정의 컨트롤입니다 :

<UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../../Resources/MMJCeoResources.xaml" /> 
       <ResourceDictionary> 
        <Style TargetType="TextBlock" x:Key="AlertTextStyle"> 
         <Setter Property="FontSize" Value="15"></Setter> 
         <Setter Property="Margin" Value="10" /> 
         <Setter Property="Padding" Value="10" /> 
        </Style> 
        <DataTemplate x:Key="DangerAlert"> 
         <Grid Background="LightPink"> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="10*"/> 
          </Grid.RowDefinitions> 
          <Border Width="10" 
            Height="10" 
            BorderBrush="DarkRed" 
            HorizontalAlignment="Right" 
            Margin="5" 
            Grid.Row="0"> 
            <TextBlock Text="X" /> 
          </Border> 
          <TextBlock Grid.Row="1" Text="{Binding Message}" Style="{StaticResource AlertTextStyle}" Foreground="DarkRed"/> 
         </Grid> 
        </DataTemplate> 
        <DataTemplate x:Key="SuccessAlert"> 
         <Grid Background="LightGreen"> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="10*"/> 
          </Grid.RowDefinitions> 
          <Border Width="10" 
            Height="10" 
            BorderBrush="DarkGreen" 
            HorizontalAlignment="Right" 
            Margin="5" 
            Grid.Row="0"> 
           <TextBlock Text="X" /> 
          </Border> 
          <TextBlock Grid.Row="1" Text="{Binding Message}" Style="{StaticResource AlertTextStyle}" Foreground="DarkGreen"/> 
         </Grid> 
        </DataTemplate> 
        <DataTemplate x:Key="InfoAlert"> 
         <Grid Background="LightGreen"> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="10*"/> 
          </Grid.RowDefinitions> 
          <Border Width="10" 
            Height="10" 
            BorderBrush="DarkGreen" 
            HorizontalAlignment="Right" 
            Margin="5" 
            Grid.Row="0"> 
           <TextBlock Text="X" /> 
          </Border> 
          <TextBlock Grid.Row="1" Text="{Binding Message}" Style="{StaticResource AlertTextStyle}" Foreground="DarkGreen"/> 
         </Grid> 
        </DataTemplate> 
        <DataTemplate x:Key="WarningAlert"> 
         <Grid Background="LightSalmon"> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="10*"/> 
          </Grid.RowDefinitions> 
          <Border Width="10" 
            Height="10" 
            BorderBrush="DarkOrange" 
            HorizontalAlignment="Right" 
            Margin="5" 
            Grid.Row="0"> 
           <TextBlock Text="X" /> 
          </Border> 
          <TextBlock Grid.Row="1" Text="{Binding Message}" Style="{StaticResource AlertTextStyle}" Foreground="DarkOrange"/> 
         </Grid> 
        </DataTemplate> 
       </ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 

    <Grid> 
     <ItemsControl ItemsSource="{Binding Path=Alerts}" 
         ItemTemplateSelector="{StaticResource AlertDataTemplateSelector}"> 

     </ItemsControl> 
    </Grid> 
</UserControl> 

컨트롤 뒤에 코드 :

public sealed partial class AlertControl : UserControl 
{ 
    public static readonly DependencyProperty AlertsProperty = DependencyProperty.Register(
     "Alerts", typeof (ObservableList<Alert>), typeof (AlertControl), new PropertyMetadata(default(ObservableList<Alert>), OnAlertsChanged)); 

    public ObservableList<Alert> Alerts 
    { 
     get { return (ObservableList<Alert>) GetValue(AlertsProperty); } 
     set { SetValue(AlertsProperty, value); } 
    } 
    //I was trying to adapt another tutorial to what I was trying to accomplish but only got this far 
    public static void OnAlertsChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var old = e.OldValue as ObservableList<Alert>; 
     var me = sender as AlertControl; 

     if (old != null) 
     { 
      old.CollectionChanged -= me.OnAlertCollectionChanged; 
     } 

     var n = e.NewValue as ObservableList<Alert>; 
     if (n != null) 
      n.CollectionChanged += me.OnAlertCollectionChanged; 
    } 

    private void OnAlertCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Reset) 
     { 
      Alerts.Clear(); 
      var n = e.NewItems as ObservableList<Alert>; 
      Alerts.AddRange(n); 
     } 


    } 
    public AlertControl() 
    { 
     this.InitializeComponent(); 
     DataContext = this; 

    } 
} 

예 구현이 구현

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 

    <StackPanel Orientation="Vertical" HorizontalAlignment="Stretch"> 
     <TextBlock Style="{StaticResource PageTitle}" Text="User Information" /> 
     <controls:AlertControl Alerts="{Binding ViewAlerts}" /> 

의 ViewAlerts 속성에 4 개의 정적으로 정의 된 알림이 있으므로 표시해야하는 값이 있다는 것을 알고 있습니다. 쪽으로.

+0

OnAlertCollectionChanged에서 뭔가를 수행해야한다고 생각하지만 정확히 무엇이 확실하지 않습니다. – Mike

답변

1

그런 다음 외부 바인딩을 사용하면 경고에 바인딩 할 수 후 제어

<Grid x:Name="InnerGrid"> 
    <ItemsControl ItemsSource="{Binding Path=Alerts}" 
        ItemTemplateSelector="{StaticResource AlertDataTemplateSelector}"> 

    </ItemsControl> 
</Grid> 


public AlertControl() 
{ 
    this.InitializeComponent(); 
    InnerGrid.DataContext = this; 
} 

내부에 ViewAlerts를 검색하기 때문에, 내면의 그리드 컨트롤 자체에이 데이터 컨텍스트 및하지를주고,해야 알림은 InnerGrid 내의 ItemsControl에 바인딩됩니다.

관련 문제