のリストがあり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;
...
}