0

複数の状態ボタンのような「状態」の監視可能なコレクションを持つカスタム コントロールがあります。混乱を避けるために、必要なコードのみをここに示します。

public class MyMultiStateBtn : ItemsControl
{
    MyMultiStateBtn()
    {
       m_states = new ObservableCollection<MyState>();
    }

    private ObservableCollection<MyState> m_states;
    public System.Collections.ObjectModel.ObservableCollection<MyState> States
    {
       get { return m_states; }
       set { m_states = value; }
    }
}

「MyState」クラス (コレクション内のオブジェクト) には、カスタム コントロールの各位置の上に表示する公開の「Name」プロパティが含まれています。

今。ウィンドウの XAML で、MyMultiStateBtn の 2 つのインスタンスを作成しました。そのうちの 1 つは次のようになります (2 番目のインスタンスは明らかに「状態」のリストが異なります)。

<local:MyMultiStateBtn x:Name="AAA" Template="{StaticResource MultiStateBtnTpl}">
    <local:MyMultiStateBtn.States>
        <local:MyState Name="On"/>
        <local:MyState Name="Off" Value="1"/>
        <local:MyState Name="Auto" Value="2"/>
    </local:MyMultiStateBtn.States>
</local:MyMultiStateBtn>

ここまでは順調ですね。これらのコントロールがテンプレート ("MultiStateBtnTpl") を使用していることに注意してください。このテンプレートは、TextBoxes を使用して州名を表示しています...そして、ここで構文に迷いました。何百万回も失敗した試みは割愛します...これが私が考えていたことの大まかなことです(注:このバインディングが機能しないことはわかっています!):

<ControlTemplate x:Key="MultiStateBtnTpl" TargetType="{x:Type loca:MyMultiStateBtn}">
    <Grid Width="130" Height="120">
        <TextBlock x:Name="tkValue1" Text="{Binding States, Path=[0].Name}" />
        <TextBlock x:Name="tkValue2" Text="{Binding States, Path=[1].Name}" />
        <TextBlock x:Name="tkValue3" Text="{Binding States, Path=[2].Name}" />
    </Grid>
</ControlTemplate>

一言で言えば、監視可能なコレクションのアイテム内に埋め込まれた文字列をテンプレートに検出させるにはどうすればよいですか...

情報がそこにあることは知っていますが、配列 (コレクション) の個々の要素内のデータにアクセスするのに役立つものは何も見つかりませんでした。

助けてくれてありがとう!

セブ

PS: 3 つの個別のプロパティを作成し、controltemplate でそれらにアクセスできました。ただし、場合によっては、最大 10 または 20 のポジションが存在することもあります。20個の個別のプロパティを持つことは避けたいです。

4

1 に答える 1

3

RelativeSourceバインディングを使ってみる

<TextBlock x:Name="RelativeSourceBinding" 
           Text="{Binding States[0].Name, 
               RelativeSource={AncestorType local:MyMultiStateBtn}}" />
于 2011-11-08T17:24:30.233 に答える