2
<Grid Grid.Row="1" Width="500" Height="500">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Ellipse Fill="Red" HorizontalAlignment="Center" Height="25" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Center" Width="25"/>
    <Ellipse Fill="Red" HorizontalAlignment="Center" Height="25" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Center" Width="25" Grid.Row="1"/>
    <Ellipse Fill="Red" HorizontalAlignment="Center" Height="25" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Center" Width="25" Grid.Row="3"/>
    <Ellipse Fill="Red" HorizontalAlignment="Center" Height="25" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Center" Width="25" Grid.Column="4"/>
    <Ellipse Fill="Red" HorizontalAlignment="Center" Height="25" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Center" Width="25" Grid.Column="4" Grid.Row="4"/>
</Grid>

上記の XAML を考えると、プロパティが true の場合にドットを緑色にしたいと考えています。私は DataTrigger でそれを行うと仮定していますが、それを実行する唯一の方法は、楕円ごとに複製することです。それは私にはハックに思え、彼らがより良い解決策であるかどうか疑問に思っていました. 各楕円は単一のプロパティに基づいていますが、これも多くの重複コードのようです。理想的には、このビューが「ステーション」のリストの状態を反映し、ブール値を使用して利用可能かどうかを判断することです。それぞれの状態は一方向であり、ビューがアップしている間は変更されません。

私は、WPF と XAML で洗練されたソリューションを考え出すのは初めてです。完全なハックのように見えるので、何かを試みるたびにうんざりします。

編集: @Alastair の回答のおかげで、機能するようになりました。

4

2 に答える 2

10

そこでUserControl、Ellipse を含むカスタムを作成します。

その後、データトリガーを に配置できますUserControl。次にDataContext、カスタム コントロールの をブール プロパティにバインドし、次に を の にバインドDataTriggerDataContextますUserControl

したがって、XAML をきれいに保つことができます。

編集:

基本的なユーザー コントロール。これは、リソースではなく、別のファイルで定義する必要があります。プロジェクトを右クリック -> [追加] -> [新しい項目...] を選択し、[WPF UserControl] を選択します。

<UserControl x:Class="Test_WPF.MyEllipseControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Ellipse  HorizontalAlignment="Center"
                  Height="25"
                  Margin="0,0,0,0"
                  Stroke="Black"
                  VerticalAlignment="Center"
                  Width="25" 
                  Fill="Red">
            <Ellipse.Style>
                <Style TargetType="Ellipse">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsAvailable}"
                                     Value="True">
                            <Setter Property="Fill"
                                    Value="Green" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Ellipse.Style>
        </Ellipse>
    </Grid>
</UserControl>

そして、あなたはそれを使用します:

<local:MyEllipseControl DataContext="{Binding Path=Station1}" />

名前空間はローカル プロジェクトのlocal名前空間です。

于 2013-04-22T03:44:44.877 に答える