0

누군가가 이것을 도와 주길 바랍니다. 이미지 편집에 사용되는 Silverlight 앱을 만들고 있습니다. 사용자는 요소가 포함 된 레이어가 포함 된 프로젝트를 가지고 있습니다. 요소는 텍스트 및 이미지 요소입니다.업데이트 Observable 오브젝트 속성 변경 콜렉션이 변경되었습니다.

프로젝트를 나타내는 클래스가 있습니다. ObservableCollection을 포함하고 각 레이어에는 ObservableCollection이 있습니다. 요소는 추상 클래스입니다. Element에서 상속받은 TextElement 및 ImageElement 클래스가 있습니다.

제 컬렉션의 요소를 변경할 때 UI가 업데이트되지 않습니다. 내 모든 속성에 INotifyPropertyChanged를 사용하고 있는데 CollectionChanged를 콜렉션에 붙잡고 있지만 아직 이동하지 않습니다. ObservableCollection의 CollectionChanged 이벤트는 해당 요소 중 하나의 업데이트에 결코 부딪 치지 않습니다.

이 내가 가진 원래 있던 코드 :

void Elements_CollectionChanged(
    object sender,  
    System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ this.NotifyChange("Elements"); } 

은 바인딩이 포함 된 클래스가

public class LayerElementToFrameworkElementConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Element element = value as Element; 
     if (element is ImageEditor.Client.BLL.TextElement) 
     { 
      ImageEditor.Client.BLL.TextElement txt = element as ImageEditor.Client.BLL.TextElement; 
      return CreateTextBlock(txt); 
     } 
     else if (element is ImageElement) 
     { 
      ImageElement imgEle = element as ImageElement; 
      return CreateImage(imgEle); 
     } 
     else 
      return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     FrameworkElement frameworkElement = value as FrameworkElement; 
     if (frameworkElement is TextBlock) 
     { 
      TextBlock txtBlock = value as TextBlock; 
      return CreateTextElement(txtBlock); 
     } 
     else if (frameworkElement is Image) 
     { 
      Image img = value as Image; 
      return CreateImageElement(img); 
     } 
     else 
      return null; 
    } 

    private TextBlock CreateTextBlock(TextElement textElement) 
    { 
     TextBlock text = new TextBlock(); 
     text.Text = textElement.Text; 
     text.Cursor = Cursors.Hand; 
     text.SetValue(Canvas.ZIndexProperty, textElement.Order); 

     ColorHexToBrushConverter converter = new ColorHexToBrushConverter(); 
     SolidColorBrush brush = (SolidColorBrush)converter.Convert(textElement.Color, null, null, null); 
     text.Foreground = brush; 

     return text; 
    } 

    private TextElement CreateTextElement(TextBlock textBlock) 
    { 
     TextElement textElement = new TextElement(); 
     textElement.Text = textBlock.Text; 
     textElement.Top = (double)textBlock.GetValue(Canvas.TopProperty); 
     textElement.Left = (double)textBlock.GetValue(Canvas.LeftProperty); 
     textElement.Order = (int)textBlock.GetValue(Canvas.ZIndexProperty); 

     ColorHexToBrushConverter converter = new ColorHexToBrushConverter(); 
     textElement.Color = (string)converter.ConvertBack(textBlock.Foreground, null, null, null); 

     return textElement; 
    } 

    private Image CreateImage(ImageElement imageElement) 
    { 
     Image img = new Image(); 
     img.Width = imageElement.Width; 
     img.Height = imageElement.Height; 
     img.Source = imageElement.Source; 
     img.Opacity = imageElement.Opacity; 
     img.Cursor = Cursors.Hand; 

     img.SetValue(Canvas.ZIndexProperty, imageElement.Order); 
     img.SetValue(Canvas.TopProperty, imageElement.Top); 
     img.SetValue(Canvas.LeftProperty, imageElement.Left); 

     return img; 
    } 

    private ImageElement CreateImageElement(Image image) 
    { 
     ImageElement imageElement = new ImageElement(); 
     imageElement.Width = image.Width; 
     imageElement.Height = image.Height; 
     imageElement.Source = (BitmapImage)image.Source; 
     imageElement.Order = (int)image.GetValue(Canvas.ZIndexProperty); 

     return imageElement; 
    } 
} 

:

<!-- Workspace --> 
     <ScrollViewer Grid.Column="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Margin="5" DataContext="{Binding Project}"> 
      <Canvas x:Name="Canvas" Background="LightGray" Width="{Binding Path=CanvasWidth}" Height="{Binding Path=CanvasHeight}"> 
       <ItemsControl ItemsSource="{Binding Path=Layers, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <Canvas /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 

         <DataTemplate>         
          <ItemsControl ItemsSource="{Binding Path=Elements, Mode=OneWay}"> 
           <ItemsControl.ItemsPanel> 
            <ItemsPanelTemplate> 
             <Canvas Background="{Binding Path=BackgroundColor}" 
               Visibility="{Binding Path=Visible, Converter={StaticResource BoolConverter}}" 
               Opacity="{Binding Path=Opacity}" 
               Width="{Binding ElementName=Canvas, Path=DataContext.CanvasWidth}" 
               Height="{Binding ElementName=Canvas, Path=DataContext.CanvasHeight}"> 
             </Canvas> 
            </ItemsPanelTemplate> 
           </ItemsControl.ItemsPanel> 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
             <Canvas> 
              <ContentControl Content="{Binding Converter={StaticResource ElementConverter}}" 
                  Canvas.Top="{Binding Path=Top, Mode=TwoWay}" 
                  Canvas.Left="{Binding Path=Left, Mode=TwoWay}" 
                  Opacity="{Binding Path=Opacity}" 
                  MouseLeftButtonDown="ContentControl_MouseLeftButtonDown"> 
               <interactivity:Interaction.Behaviors> 
                <behaviors:DragInCanvasBehavior /> 
               </interactivity:Interaction.Behaviors> 
              </ContentControl> 
             </Canvas> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
          </ItemsControl>         
         </DataTemplate> 

        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </Canvas> 
     </ScrollViewer> 

이 내 변환기입니다 수령 :

사람이 나는 매우 감사하게 될 것입니다 도움이 될 수있는 경우

public class TextElement : Element 
{ 
    public string Text 
    { 
     get { return this.GetValue<string>("Text"); } 
     set { this.SetValue<string>("Text", value); } 
    } 

    public int FontSize 
    { 
     get { return this.GetValue<int>("FontSize"); } 
     set { this.SetValue<int>("FontSize", value); } 
    } 

    public bool Bold 
    { 
     get { return this.GetValue<bool>("Bold"); } 
     set { this.SetValue<bool>("Bold", value); } 
    } 

    public bool Italic 
    { 
     get { return this.GetValue<bool>("Italic"); } 
     set { this.SetValue<bool>("Italic", value); } 
    } 

    public string Color 
    { 
     get { return this.GetValue<string>("Color"); } 
     set { this.SetValue<string>("Color", value); } 
    } 

    public FontFamily Font 
    { 
     get { return this.GetValue<FontFamily>("Font"); } 
     set { this.SetValue<FontFamily>("Font", value); } 
    } 

    public TextElement() 
     : this("Untitled", 1, 5, 5, 0, 0, 0, "New text", 12, false, false, "#aaaaaa", new FontFamily("Arial")) 
    { 
    } 

    public TextElement(string name, double opacity, double top, double left, double rotateAngle, double centerX, double centerY, 
     string text, int fontSize, bool bold, bool italic, string color, FontFamily font) 
     : base(name, opacity, top, left, rotateAngle, centerX, centerY) 
    { 
     this.Text = text; 
     this.FontSize = fontSize; 
     this.Bold = bold; 
     this.Italic = italic; 
     this.Color = color; 
     this.Font = font; 
    } 
} 

:

이은 요소의 하나에 대한 코드입니다.

+0

UI의 컨트롤에 바인딩 된 요소 컬렉션이 있습니까? 예인 경우 바인딩을 게시 할 수 있습니까? 또한 요소 코드를 게시 할 수 있습니까? –

+0

'Element'는'INotifyPropertyChanged'를 구현합니까? –

+0

예 모든 개체가 INotifyPropertyChanged를 구현합니다. – Matthew

답변

0

SetValue 내부에서 PropertyChanged 이벤트를 발생 시키나요? 그렇지 않으면 Element의 각 속성에 대해이 작업을 수행해야합니다.

public string Text 
    { 
     get { return this.GetValue<string>("Text"); } 
     set { this.SetValue<string>("Text", value); this.InvokePropertyChanged("Text"); } 
    } 

private void InvokePropertyChanged(string propertyName) 
{ 
    if(this.PropertyChanged != null) 
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 
관련 문제