2

複数の編集済みオブジェクトに使用できるエディタービューがあります。複数のオブジェクトのビューモデルは、処理する必要のあるフィールドごとに、Bool型のField1Multipleのようなプロパティを提供します。この場合、現時点ではComboBoxコントロールのみです。そのフィールドに複数の異なる値を指定する場合は常に、App.xamlで定義されているそのコントロールに特定のスタイルを適用する必要があります。このスタイルは、コントロールの背景を変更して、ここに表示できる単一の値がないことを視覚化します。

私はこのXAMLコードで試しました:

<ComboBox
  ItemsSource="{Binding Project.Field1Values}" DisplayMemberPath="DisplayName"
  SelectedItem="{Binding Field1}">
  <ComboBox.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding Field1Multiple}" Value="true">
          <Setter
            Property="ComboBox.Style"
            Value="{StaticResource MultiValueCombo}"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ComboBox.Style>
</ComboBox>

ただし、Style内からStyleプロパティを設定できないため、機能しません。コントロールで直接トリガーを使用する場合、EventTriggersのみが存在し、DataTriggersは存在しない可能性があるとコンパイラーは言います。

バインディング値に基づいてコントロールのスタイルを設定するにはどうすればよいですか?または、バインディング値がtrueの場合、コントロールに特定のスタイルを設定するにはどうすればよいですか?

4

1 に答える 1

5

(完全なソリューションに編集)

コンバーターを使用できます:

  public class AnyIsMultipleToStyle : IValueConverter
    {
        public Style NormalStyle { get; set; }

        public Style MultiStyle { get; set; }


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                IList<SampleClass> list= value as IList<SampleClass>;
                if (list!=null)
                {
                    if (list.Any(i => i.Multi))
                        return MultiStyle;

                }

            }
            return NormalStyle;
        }

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

そしてあなたのxamlで:(あなたは通常のスタイルとマルチスタイルをコンバーターに示します)

 <Window.Resources>

        <Style x:Key="MultiValueCombo"  TargetType="{x:Type ComboBox}">

            <Setter Property="Background" Value="Olive" />
        </Style>

        <Style x:Key="NormalCombo"  TargetType="{x:Type ComboBox}">
            <Setter Property="Background" Value="Red" />
        </Style>
        <my:AnyIsMultipleToStyle x:Key="AnyIsMultipleToStyle1" MultiStyle="{StaticResource MultiValueCombo}" NormalStyle="{StaticResource NormalCombo }"  />





    </Window.Resources>
    <Grid>

        <ComboBox    ItemsSource="{Binding Items, ElementName=root}"  >
            <ComboBox.Style>
                <Binding Converter="{StaticResource AnyIsMultipleToStyle1}" Path="Items" ElementName="root" >

                    </Binding>
            </ComboBox.Style>

        </ComboBox>
    </Grid>
于 2012-09-13T15:38:28.780 に答える