3

ユーザー コントロールを List<> にバインドするのに少し問題があります。次のようなことをしようとするとうまくいきます:

public string Map
{
    get { return (string)GetValue(MapProperty); }
    set
    {
        SetValue(MapProperty, value);
    }
}

public static readonly DependencyProperty MapProperty =
DependencyProperty.Register(
    "Map",
    typeof(string), 
    typeof(GamePane), 
    new PropertyMetadata(     
        "Unknown",            
        ChangeMap)
    );

ただし、文字列、int、float など以外のプロパティを使用しようとすると、「メンバー 'プロパティ名' が認識されないか、アクセスできません」というメッセージが表示されます。例:

public List<string> Players
{
    get { return (List<string>)GetValue(PlayersProperty); }
    set
    {
        SetValue(PlayersProperty, value);
    }
}

public static readonly DependencyProperty PlayersProperty =
DependencyProperty.Register(
    "Players",   
    typeof(List<string>),
    typeof(GamePane),  
    new PropertyMetadata(     
        new List<string>(), 
        ChangePlayers)
    );

タイプ以外のコードはまったく同じです。

BindableList を使用する必要があるかもしれないことを確認しましたが、これは Windows 8 プロジェクトには存在しないようです。

誰かが私を適切な方向に向けるか、別のアプローチを教えてくれますか?

編集: リクエストにより、文字列リストをバインドしようとするリスト ビューの XAML:

<ListView x:Name="PlayerList" SelectionMode="None" ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.VerticalScrollMode="Disabled" ItemsSource="{Binding Players}"
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" Margin="6,-1,0,0" IsHitTestVisible="False">

次に、メイン ビューで GridView を描画します。これにより、バインディングが作成され、例外があります。

<GridView
    x:Name="currentGames"
    AutomationProperties.AutomationId="ItemsGridView"
    AutomationProperties.Name="Items"
    TabIndex="1"
    Padding="12,0,12,0"
    ItemsSource="{Binding Source={StaticResource itemsViewSource}}"
    SelectionMode="None"
    IsSwipeEnabled="false" Grid.Row="1" Margin="48,-20,0,0" Height="210" VerticalAlignment="Top" >
    <GridView.ItemTemplate>
        <DataTemplate>
            <local:GamePane Map="{Binding Map}" Time="{Binding TimeRemaining}" Players="{Binding Players}"/>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

興味深いことに、この XAML は Visual Studio のデザイナーと Blend のデザイナーの両方を壊しますが、コードは実行されます。とはいえ、私のプレイヤーは表示されません。

4

1 に答える 1

2

ええ、それは動作します。

バインドする XAML は次のとおりです。

<Grid Background="Black">
    <local:MyUserControl x:Name="MyControl" />
    <ListBox ItemsSource="{Binding MyList, ElementName=MyControl}" />
</Grid>

ユーザー制御コードは次のとおりです。

public sealed partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        this.InitializeComponent();
    }

    public string[] MyList
    {
        get { return new string[] { "One", "Two", "Three" }; }
    }
}
于 2012-10-18T16:26:33.137 に答える