2016-10-05 13 views
-1

これは非常に基本的な質問ですが、WPFは最初のクリックではなく2番目のプロパティ(例:背景)を変更しないのはなぜですか?私はViewModelを使用して、私のUIから値を格納します。したがって、ユーザーが[保存]ボタンをクリックすると、簡単にアクセスできます。UIElementは最初のクリックでプロパティを変更しません

のViewModelはただの抜粋です、ここで、いくつかのプロパティが含まれています

<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イベントハンドラ:

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マークアップであります

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が開きますが、[OK]をクリックするとパネルの色は変わりません。これを再度実行して選択を送信する場合にのみ、前に選択した色が表示されます。

誰かが私にここで間違っていることを教えてもらえますか?

+0

イベントを発生させ、確認してください。タグセクションは、それらが正しくインデックスされ、他のユーザーによって認識されることを保証します – Tseng

答えて

0

よろしくお願いします。

間違いは、新しい色を設定する前に、OnPropertyChanged Methodeが(この方法でもPropertyChangedイベント)呼び出されるということです。

ただ、新しい値が設定されている場合は、タイトルにタグを強制しないでください新しい値を設定し、その後

関連する問題