2011-12-27 7 views
0

私はtelerikのRadComboBoxを持っていますが、いくつかのプロパティの保護されたセッターがあります。私はそれぞれのプロパティを設定できるようにしたいので、私はそのコントロールから派生し、私はカスタムコントロールを作成しました。私も同じことをアイテムのコンポーネントにしました。私の場合はPropertyInfoのSetValueを使用したSilverlightディープコピーのUIElement?

public class RadComboBoxItem : ListBoxItem 
{ 

    ... 

    public bool IsHighlighted 
{ 
    get 
    { 
     return (bool)GetValue(IsHighlightedProperty); 
    } 
    protected set 
    { 
     this.SetValue(IsHighlightedPropertyKey, value); 
    } 
} 

    ... 

} 

public class MyCustomComboBoxItem : RadComboBoxItem 
{ 
    public void HighlightItem(bool _default) 
    { 
     this.IsHighlighted = _default; 
    } 
} 

私はRadComboBoxItemsのリストを持っていると私はタイプMyCustomComboBoxItemの新しいリストを作成したいので、私は、データに基づいて、第1のリストから各項目のセッターにアクセスすることができます。

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     ... 

     foreach (RadComboBoxItem _item in _listOfRadComboBoxItems) 
     { 
      MyCustomComboBoxItem _customCBI = new MyCustomComboBoxItem(); 
      _customCBI.Load(_customCBI.GetType(), _item, true); 
      _listOfCustomCBI.Add(_newB2); 
     } 
    } 
} 

私は私がやろうとしています何の説明で別のポストを見つけましたが、私の場合は少し異なっており、私はここからLoadメソッドを借り:

Updating ObservableCollection Item properties using INotifyPropertyChanged

public static class ExtentionMethods 
{ 
    public static void Load<T>(this T target, Type type, T source, bool deep) 
    { 
     foreach (PropertyInfo property in type.GetProperties()) 
     { 
      if (property.CanWrite && property.CanRead) 
      { 
       if (!deep || property.PropertyType.IsPrimitive || property.PropertyType == typeof(String)) 
       { 
        property.SetValue(target, property.GetValue(source, null), null); 
       } 
       else 
       { 
        object targetPropertyReference = property.GetValue(target, null); 
        targetPropertyReference.Load(targetPropertyReference.GetType(), property.GetValue(source, null), deep); 
       } 
      } 
     } 
    } 
} 

要約:私がここでやろうとしているのは、TelerikのRadComboBoxからカスタムコンボボックスを作成することです。これには、IsHighlighted依存関係プロパティーセッターが保護されているComboBoxItemsがあります。この制限を回避するためにMyCustomComboBoxItemを作成しましたが、RadComboBoxItemをMyCustomComboBoxItemにコピーすることはできません。

理由:私はそれを設定できるようにしたいので、私はより良い経験でユーザーを助けることができます。

ありがとうございました。

+0

プロパティは依存すべきではありませんプロパティ? –

+0

私のプロジェクトでは、protectedプロパティは依存関係プロパティです。私はこの例を単純化しようとしました。私がやろうとしているのは、TelerikのRadComboBoxに基づいたカスタムComboBoxを作成することです.SoHighlightedプロパティは保護されたセッターを持つものです。ユーザーのためにアイテムを選択する必要はないので、強調表示の仕組みを使用する必要がありますが、最終的な選択に近づけたいと思っています。 – asuciu

答えて

0

RadComboBoxItemのIsHightlightedプロパティは内部プロパティであり、おそらく理由があります。独自の目的のためにプロパティを操作しようとすると、結果は予測不可能になる可能性があります。

IsHighlightedプロパティは、単に視覚的な状態の変化を引き起こすために使用されます。 あなただけ与えられた状況の下で項目を強調表示したい場合は、最善のアプローチは、(ブレンドを使用して、このために最も簡単です)RadComboBoxItemのControlTemplateのコピーを作成します

  • にあります。
  • 派生クラスを作成します(すでに作成済み)。
  • 独自のDependencyProperty(または使用する方法に応じてプロパティまたはメソッド)を追加し、コピーしたControlTemplateおよびStyleのTargetTypeを新しいクラスのDefaultStyleKeyと一致するように変更します。

これで、新しいVisualStateGroupをコントロールテンプレートの既存のコレクションに追加するだけで済みます。そのグループのVisualStateには、少なくとも1つの空の(デフォルト)状態とカスタムの強調表示された状態が含まれている必要があります。ベストプラクティスでは、強調表示された状態は、他の状態の影響を受けないプロパティにのみ影響する必要があります。例えば

<ControlTemplate TargetType="controls:MyCustomComboBox"> 
    <Grid x:Name="VisualRoot"> 
        ... 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates" ei:ExtendedVisualStateManager.UseFluidLayout="True"> 
          ... 
         <VisualStateGroup x:Name="MyHighlightStates"> 
          <VisualState x:Name="NotHighlightedState" /> 
          <VisualState x:Name="MyHightlightedState"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MyHighlightElement" Storyboard.TargetProperty="Visibility"> 
             <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
              <DiscreteObjectKeyFrame.Value> 
               <Visibility>Visible</Visibility> 
              </DiscreteObjectKeyFrame.Value> 
             </DiscreteObjectKeyFrame> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
     <Border x:Name="MyHighlightElement" Background="Yellow" Visibility="Collapsed"/> 

    ... 
    </Grid> 
</ControlTemplate > 

最後に、あなたは自分のコントロールの方法から、視覚的状態変化をトリガするためにVisualStateManagerを使用する必要があります。

VisualStateManager.GoToState(this, "MyHightlightedState", true); 
関連する問題