2014-02-16 4 views
0

У меня есть прямоугольник, который я хочу, чтобы установить 4 различных значки на основе, если значение в моем page.cs между определенными значениями, например:DataTrigger не стрельбы при использовании конвертера

If value is 0 show icon 1. 
if value is larger than 0 but smaller or equal to 0.25 show icon 2. 
If value is >0.25 && value is <=0.5 show icon 3. 
If value is >0.5 && value is <=0.75, show icon 4. 
and If value is >0.75 && value is <=1 show icon 5. 

Вот что моя переменная выглядит следующим образом:

private double _double = 0.25; 
    public double Volume 
    { 
     get 
     { 
      return _double; 
     } 
     set 
     { 
      _double = value; 
      OnPropertyChanged("Volume"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

у меня также есть INotifyPropertyChanged установить рядом с partial class

И вот конвертер я использую:

[ValueConversion(typeof(double), typeof(int))] 
public class VolumePicture : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (System.Convert.ToDouble(value) <= 0.25) 
     { 
      return 1; 
     } 
     else if (System.Convert.ToDouble(value) > 0.25 && System.Convert.ToDouble(value) <= 0.5) 
     { 
      return 2; 
     } 
     else if (System.Convert.ToDouble(value) > 0.5 && System.Convert.ToDouble(value) <= 0.75) 
     { 
      return 3; 
     } 
     else if (System.Convert.ToDouble(value) > 0.75 && System.Convert.ToDouble(value) <= 1) 
     { 
      return 4; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Это в основном принимает ввод и делает именно то, что я описал в первой части.

Aaaand вот XAML у меня есть для прямоугольника, который я хочу, чтобы изменить OpacityMask для:

<Rectangle Height="20" Margin="0,2,0,0"> 
       <Rectangle.Style> 
        <Style TargetType="{x:Type Rectangle}"> 
         <Setter Property="Fill" Value="#FF929292" /> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding IsMouseOver, ElementName=VolumeButton}" 
           Value="True"> 
           <Setter Property="Fill" Value="White" /> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=NowPlaying.Volume, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource VolumePictureConverter}}" Value="5"> 
           <Setter Property="OpacityMask"> 
            <Setter.Value> 
             <VisualBrush Visual="{StaticResource appbar_sound_mute}"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=NowPlaying.Volume, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=VolumePictureConverter}}" Value="1"> 
           <Setter Property="OpacityMask"> 
            <Setter.Value> 
             <VisualBrush Visual="{StaticResource appbar_sound_0}"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=NowPlaying.Volume, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=VolumePictureConverter}}" Value="2"> 
           <Setter Property="OpacityMask"> 
            <Setter.Value> 
             <VisualBrush Visual="{StaticResource appbar_sound_1}"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=NowPlaying.Volume, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=VolumePictureConverter}}" Value="3"> 
           <Setter Property="OpacityMask"> 
            <Setter.Value> 
             <VisualBrush Visual="{StaticResource appbar_sound_2}"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=NowPlaying.Volume, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ResourceKey=VolumePictureConverter}}" Value="4"> 
           <Setter Property="OpacityMask"> 
            <Setter.Value> 
             <VisualBrush Visual="{StaticResource appbar_sound_3}"/> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </Rectangle.Style> 
      </Rectangle> 

Это может выглядеть довольно грязно, и для этого, мне очень жаль.

Но вот моя проблема: когда я изменяю переменную тома во время выполнения, ничего не происходит. Я думаю, что это конвертер, который не стреляет, но у меня нет идеи, почему это происходит (!) И поскольку я действительно не так хорош с привязкой и конвертерами и WPF в целом, я застрял в этом.

Кто-нибудь получил представление о том, что может быть нарушитель спокойствия?

Спасибо

Одна вещь, чтобы отметить, что я не всегда есть «NowPlaying.Volume» путь в там, я просто попытался кучу вещей. И когда я отладки я получаю это на выходе (который получает переименована в «Ошибке Path:„Volume“». Когда я удалить Nowplaying

System.Windows.Data Error: 40 : BindingExpression path error: 'NowPlaying' property not found on 'object' ''Rectangle' (Name='')'. BindingExpression:Path=NowPlaying.Volume; DataItem='Rectangle' (Name=''); target element is 'Rectangle' (Name=''); target property is 'NoTarget' (type 'Object') 
+0

так почему связывание с ' NowPlaying.Volume' вместо просто 'Volume'? Я не вижу ничего определенного как' NowPlaying' ther e – har07

+0

@ har07 NowPlaying - это название страницы, как я уже сказал, я в основном добавил, что в надежде, что он ее найдет. Но это точно так же, если я удаляю «NowPlaying» из пути привязки. – Tokfrans

ответ

1

кажется, что вы являетесь обязательными для Rectangle .. а это DataContext Rectangle не обладает свойством Volume, следовательно, вы получите сообщение об ошибке связывания Попробуйте изменить привязку заявление что-то вроде этого (обратите внимание на эту часть: ...Path=DataContext.Volume...):

<Rectangle.Style> 
    <Style TargetType="{x:Type Rectangle}"> 
     ....... 
     <Style.Triggers> 
      ....... 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=DataContext.Volume, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource VolumePictureConverter}}" 
        Value="5"> 
       <Setter Property="OpacityMask"> 
        <Setter.Value> 
         <VisualBrush Visual="{StaticResource appbar_sound_mute}"/> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
      ....... 
     </Style.Triggers> 
     ....... 
    </Style> 
</Rectangle.Style> 
+1

Удивительный! Единственное, что я должен был сделать после этого, - установить прямоугольники DataContext в Binding, а в параметре Page_initialize установить значение Datasource = this. Спасибо огромное! Это сводило меня с ума – Tokfrans