1

項目コントロールにあるラジオ ボタンにイベントをリンクしようとしています。

私のテンプレートは以下です:

<ItemsControl x:Name="RadioButtonsItemsControl" Height="auto" Width="auto" ItemsSource="{TemplateBinding MapLayers}" >

                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>

                                <StackPanel Orientation="{TemplateBinding RadioButtonOrientation}" Margin="5"/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>

                        <ItemsControl.ItemTemplate>
                            <DataTemplate>

                                <RadioButton Content="{Binding ID}" IsChecked="{Binding Visible, Mode=TwoWay}"
                                    IsEnabled = "{Binding IsInScaleRange}"
                                    ToolTipService.ToolTip=""
                                    GroupName="BaseLayer"
                                    Foreground="{TemplateBinding ForeGroundBrush}" FontSize="11">

                                </RadioButton>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>

カスタム コントロールの .cs ファイルには、アイテム コントロールのテンプレート パーツがあり、イベントを添付します。

public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        radioButtonsItemsControl = GetTemplateChild("RadioButtonsItemsControl") as ItemsControl;
        if (radioButtonsItemsControl != null) radioButtonsItemsControl.MouseLeftButtonDown += radioButtonsItemsControlMouseLeftButtonDown;
    }

radioButtonsItemsControl は null ではありません (この段階ではまだラジオ ボタンが設定されていません) が、radioButtonsItemsControlMouseLeftButtonDown イベントは、後で項目コントロール内をクリックしたときに登録する必要があります。

 void radioButtonsItemsControlMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        RadioButton radioButton = e.OriginalSource as RadioButton;
        if (radioButton != null) radioButton.Checked += OnChecked;
    }

ただし、アイテムコントロールをクリックしても、これは決して発生しません:radioButtonsItemsControlMouseLeftButtonDown。

これが正しい方法であるかどうかわからないので、ItemsControls 内のアイテムにイベントをアタッチする別の方法を受け入れます。

ありがとう、マイク

4

1 に答える 1

0

通常、イベントをアタッチするには、部分的なクラス拡張を行い、バインドできるコマンドのハッシュテーブルを指定します。あなたの場合、最も簡単な方法は、リストがバインドされた後に設定されるイベントを定義することです。たとえば、セットのプロパティ Visible は、何らかのイベントが定義されているかどうかを確認し、定義されている場合はそれを呼び出します。例えば

(OnRadioButtonChanged) を見るイベントを作成します。リストがロードされた後にイベントに添付します。(リロードのためにリストがクリアされたら、イベントを切り離します)。イベントが存在すると、可視性が切り替えられると、ベントが呼び出されます。コード例は次のとおりです。

public string Visibility
    {
        get
        {
            return __fVisibility;
        }
        set
        {
            __fVisibility = value;
            this.NotifyPropertyChanged("Visibility");
            if (!object.ReferenceEquals(OnVisibilityChanged, null))
                OnVisibilityChanged(null);
        }
    }

それは私にとって、よりクリーンでシンプルなソリューションです。:)

于 2012-05-04T01:06:35.700 に答える