0

私は次のXMLを持っています:

<Items>
  <Item>
    <Name>Item One</Name>
    <MyValue>42</MyValue>
  </Item>
</Items>

およびXAML:

<DockPanel>
    <DockPanel.Resources>
        <XmlDataProvider x:Key="ItemsXml" XPath="Items/Item"
            Source="Resources/Items.xml"/>
    </DockPanel.Resources>

    <ListBox
        ItemsSource="{Binding Source={StaticResource ItemsXml}}"
        DisplayMemberPath="Name" Name="itemList"/>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="50"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.Resources>
            <Style x:Key="ValueFormat" TargetType="Label">
                <Setter Property="ContentStringFormat" Value="{}/{0,3}"/>
            </Style>
        </Grid.Resources>

        <Image Source="Icons/ConditionFalse.png" Grid.Column="0"/>

        <TextBox Name="myTextBox" VerticalAlignment="Center" Grid.Column="1"/>

        <Label
            Name="myLabel"
            DataContext="{Binding SelectedItem, ElementName=itemList}"
            Style="{StaticResource ValueFormat}"
            VerticalAlignment="Center"
            Content="{Binding XPath=MyValue}"
            Grid.Column="2"/>
    </Grid>
</DockPanel>

*の基準値と等しいImage.Source条件に依存させたい。参照値はXMLファイルへのバインドであるため、比較の基礎としてそれを使用することも問題ありません。にはまだ存在しないプロパティへのバインディングがあるため、オプションとして使用できます。TextBox.TextLabelTextBox

*Label現在ContentStringFormat、その値を変更するために使用しています。これに問題がある場合は、取り除くことができます。

この状態を表すプロパティに直接バインドするためにaDataTriggerを使用できますが、それはハックのように感じられるので、避けたいと思います。以下に示すようにを設定しようとしましたが、最初に(に対しては機能しました)MultiDataTriggerの条件を機能させることができませんでした。次に、私の場合、定数値は適切ではありません。また、条件がfalseと評価された場合の「else」句またはデフォルト値はありませんが、最初にチェックを行うことができれば、問題がないことを期待しています。LabelTextBox

<Image Grid.Column="0">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Value="/ 42"
                            Binding="{Binding Text, ElementName=myTextBox}"/>
                        <Condition Value="/ 42"
                            Binding="{Binding Content, ElementName=myLabel}"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Source" Value="Icons/ConditionTrue.png"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>
4

2 に答える 2

1

技術的な理由がない限り、XAMLツリーの要素にバインドするのではなく、ViewModelにバインドすることをお勧めします。ViewModelを使用すると、itemList.SelectedItemをViewModelのプロパティにバインドできます(たとえば、CurrentItemと呼びます)。また、画像のソースを別のViewModelプロパティ(StatusImageSourceという名前の場合もあります)にバインドします。次に、ユーザーがitemListで選択した値を変更したときに、CurrentItem.Setのラベルの値と等しいかどうかを確認し、StatusImageSourceの値を適切に更新できます。

于 2012-12-09T03:35:02.667 に答える
0

ハリーのコメントは私を正しい方向に導いた。

XAML:

<Grid.Resources>
    <local:MyImageConverter x:Key="MyImageConverter"/>
</Grid.Resources>

<Image Grid.Column="0" Grid.Row="0">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Source" Value="Icons/ConditionFalse.png"/>
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding
                            Converter="{StaticResource MyImageConverter}">
                            <Binding ElementName="myTextBox" Path="Text"/>
                            <Binding ElementName="myLabel" Path="Content"/>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Source" Value="Icons/ConditionTrue.png"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

C#

public class MyImageConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        System.Xml.XmlElement labelValue = values[1] as System.Xml.XmlElement;
        if (labelValue != null)
        {
            return ((string)values[0]) == labelValue.InnerText;
        }
        return false;
    }

    public object[] ConvertBack(object value, Type[] targetType,
       object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

これはすぐに非常に厄介になります。今のところこれを使用していますが、時間が許す限り、Whyaduckの回答に従ってViewModelに作り直します。

于 2012-12-09T23:52:36.973 に答える