1

のリストがありMyItemます。このオブジェクトは、幅、高さ、色などのプロパティを持つ形状を表します。Alphaコンバーターを使用して、オブジェクトが選択されている場合 (不透明度を変更したくない場合) 、塗りつぶしの色を (255, r, g, b) から ( , r, g, b) に変更しようとしています。Alpha(double) ビューモデル内に存在します。

DependencyProperty.UnsetValue私の問題は、私が何を与えても、コンバーターに送信される両方の値が に設定されることです。のみを指定Pathすると、ビューモデルにバインドされると予想されますが、そうではありません。明らかに、私はここで何か間違ったことをしています。

Q:Alphaビューモデルのと DataContext のが必要MyItemColorですmyitem(MultiBinding ブロック内では DataContext のままだと思います)。Bindingタグはどのように表示されますか?

XAML

<DataTemplate>
  <Grid>
    <Rectangle x:Name="myitem" Width="{Binding MyItemWidth}" Height="{Binding MyItemHeight}" />
  </Grid>
  <DataTemplate.Triggers>
    <MultiDataTrigger>
      <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding IsSelected}" Value="False"/>
      </MultiDataTrigger.Conditions>
      <Setter TargetName="myitem" Property="Fill">
        <Setter.Value>
          <!-- Simple binding works. WHAT is the difference?
          <SolidColorBrush>
            <SolidColorBrush.Color>
              <Binding Path="Color" />
            </SolidColorBrush.Color>
          </SolidColorBrush>
          -->
          <SolidColorBrush>
            <SolidColorBrush.Color>
              <!-- Change fill color if DataContext.Scale changes -->
              <MultiBinding Converter="{StaticResource DoubleToColorConverter}">
                <!-- wrong? -->
                <Binding Path="Alpha" />
                <!-- wrong? -->
                <Binding ElementName="myitem" Path="MyItemColor" />
              </MultiBinding>
            </SolidColorBrush.Color>
          </SolidColorBrush>
        </Setter.Value>
      </Setter>
    </MultiDataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>

コンバータ

public class DoubleToColorConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType,
        object parameter, CultureInfo culture)
    {
        // values[0] == DependencyProperty.UnsetValue
        // values[1] == DependencyProperty.UnsetValue

        return null; // New color
    }

    public object[] ConvertBack(object value, Type[] targetTypes,
        object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

アップデート

私はそれを解決しました。ビューモデルにアクセスするには、親コントロール (アイテムを含む) を探す必要がありました。これの明確化、なぜそれが良い/悪いのか、答えとして十分です! 何が起こっているのか完全には理解できません:)

<MultiBinding Converter="{StaticResource DoubleToColorConverter}">
  <Binding ElementName="myItemsControl" Path="DataContext.Alpha"/>
  <Binding Path="Color" />
</MultiBinding>

と...

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue)
        return Colors.Transparent;
    ...
}
4

0 に答える 0