2016-10-05 2 views
-1

이 질문은 매우 기본적인 것 같지만 WPF는 속성 (예 : 배경)을 두 번째로 변경하지만 첫 번째 클릭을 변경하지 않는 이유는 무엇입니까? ViewModel을 사용하여 내 UI의 값을 저장합니다. 따라서 사용자가 저장 버튼을 클릭하면 쉽게 액세스 할 수 있습니다.UIElement는 처음에 속성을 변경하지 않습니다.

뷰 모델은 여기에 몇 가지 속성이 포함되어 있습니다 만 발췌 한 것입니다

using System; 
using System.Linq; 
using System.ComponentModel; 
using System.Collections.Generic; 

using Drawing = System.Drawing; 
using Media = System.Windows.Media; 

using BarcodeLib; 

namespace BarcodeEncoder 
{ 
    class BarcodeViewModel : INotifyPropertyChanged 
    { 
     // Some more properties 

     private Media.Brush foreColor; 
     public Media.Brush ForeColor 
     { 
      get { return this.foreColor; } 
      set 
      { 
       if (this.foreColor != value) 
        this.OnPropertyChanged("ForeColor"); 

       this.foreColor = value; 
      } 
     } 

     private Media.Brush backColor; 
     public Media.Brush BackColor 
     { 
      get { return this.backColor; } 
      set 
      { 
       if (this.backColor != value) 
        this.OnPropertyChanged("BackColor"); 

       this.backColor = value; 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

     } 

     public BarcodeViewModel() 
     { 
      // Initialisation of the other properties 
      this.ForeColor = new Media.SolidColorBrush(Media.Colors.Black); 
      this.BackColor = new Media.SolidColorBrush(Media.Colors.White); 
     } 
    } 
} 

그리고 여기 relevan XAML 마크 업입니다 :

<StackPanel 
    x:Name="rootElement" 
    Orientation="Horizontal" 
    Height="Auto" Width="Auto"> 
    <StackPanel.DataContext> 
     <local:BarcodeViewModel /> 
    </StackPanel.DataContext> 
    <!-- Some more UI elements --> 
    <StackPanel 
      x:Name="pForeColor" 
      Background="{Binding ForeColor}" 
      Width="Auto" Height="23" 
      Margin="5,0,5,0" 
      MouseDown="pForeColor_MouseDown"/> 
</StackPanel> 

그리고 마지막하지만 적어도 MouseDown 이벤트 핸들러 :

private void pForeColor_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    using (var cd = new Forms.ColorDialog()) 
    { 
     if (cd.ShowDialog() == Forms.DialogResult.OK) 
      this.bcvm.ForeColor = new Media.SolidColorBrush() 
      { 
       Color = Media.Color.FromArgb(cd.Color.A, cd.Color.R, cd.Color.G, cd.Color.B) 
      }; 
    } 
} 

그래서 StackPanel의 색상을 설정하려고하면 pForeColor, ColorDialog가 열리지 만 확인을 클릭하면 패널이 색상을 변경하지 않습니다. 이 작업을 다시 수행하고 선택을 제출할 때만 이전에 선택한 색상이 나타납니다.

누군가가 내게 무엇이 잘못되었는지 말해 줄 수 있습니까?

+0

제목에 태그를 넣지 마십시오. 태그 섹션은 다른 사용자가 올바르게 색인하고 인식 할 수 있도록합니다. – Tseng

답변

0

... 알았어!

실수로, 새 색상을 설정하기 전에 OnPropertyChanged Methode가 호출됩니다 (이 방법도 PropertyChanged 이벤트입니다).

새 값이 설정되어 있는지 확인한 다음 새 값을 설정하고 이벤트를 발생 시키십시오.

관련 문제