2014-10-27 75 views
0

首先,值得一提的是,我查看了其他类似的主题,他们帮助我获得了这么多,但我需要一点帮助才能完成终点线。WPF从DataTrigger更改图像

我遇到的问题是,我不能让我的DataTrigger显示正确的图像,当InPossesion布尔标志设置为false我将我的枚举属性设置为IconImage2,这反过来应该改变数据网格中的图像为红色圆圈,这不会发生。如果任何人都可以给我任何指点,说明我出错的地方会很棒。

视图模型枚举

public enum IconEnum 
{ 
    IconImage1, 
    IconImage2 
} 

public IconEnum MyIconEnumProperty 
{ 
    get { return _myEnum; } 
    set 
    { 
     _myEnum = value; 
     RaisePropertyChanged("MyIconEnumProperty"); 
    } 
    }  

视图模型方法加载订单

private void LoadCloakroomOrders() 
{ 
    CloakroomOrderRepository repo = new CloakroomOrderRepository(); 
    //Get All orders 
    var orders = repo.GetPublic(); 
    foreach (var orderItem in orders) 
     { 
      Orders.Add(orderItem); 
      if (orderItem.InPossesion == false) 
      { 
       MyIconEnumProperty = IconEnum.IconImage2; 
      } 
     } 
    } 

XAML

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Orders}" 
        SelectedItem="{Binding Path=SelectedCloakroomOrder}" 
        Margin="0,23,0,-0.5" Width="980" > 
      <DataGrid.Columns> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Image Visibility="{Binding ShowIcon, 
           Converter={StaticResource BooleanToVisibilityConverter}, 
           FallbackValue=hidden}" > 
           <Image.Style> 
            <Style TargetType="Image"> 
             <Setter Property="Source" Value="/Resources/Images/circle_green.png"/> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding MyIconEnumProperty}" Value="IconImage2"> 
               <Setter Property="Source" Value="/Resources/Images/circle_red.png"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </Image.Style> 
          </Image> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

谢谢!

+0

请发布一个问题,解释您遇到的问题,您只需要发布要求... – 2014-10-27 14:18:27

+0

请勿为视图暴露'enum'。视图模型可以使用enum(来自某些业务逻辑)的值,并将其转换为图像源,您可以使用该图像源来绑定视图图像。 – Sinatr 2014-10-27 14:51:56

回答

2

而不是在虚拟机中有一个枚举,你可以简单地有一个InPossesion属性,并隐藏/显示基于它的两个图像。这使视图模型清洁和XAML更加清晰:

视图模型:

public bool InPossession 
{ 
    get { return _inPossession; } 
    set { _inPossion = value; RaisePropertyChanged("InPossession"); } 
} 

private void LoadCloakroomOrders() 
{ 
    CloakroomOrderRepository repo = new CloakroomOrderRepository(); 
    //Get All orders 
    var orders = repo.GetPublic(); 
    foreach (var orderItem in orders) 
    { 
     Orders.Add(orderItem); 
     if (orderItem.InPossesion == false) 
     { 
      InPossession = false; 
     } 
    } 
} 

转换器:

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    public Visibility VisibilitIfTrue { get;set; } 
    public Visibility VisibilitIfFalse { get;set; } 

    public BooleanToVisibilityConverter() 
    { 
     // Set default values for the most common usage 
     VisibilityIfTrue = Visible; 
     VisibilityIfFalse = Collapsed; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

    // Converter could be extended to handle nullable bools as well, but ignore for now 
    if (value == null) 
    { 
     return DependencyProperty.UnsetValue; 
    } 

    // value should be of type bool 
    bool b = (bool)value; 
    if (b == true) 
    { 
     return VisibilityIfTrue; 
    } 
    else 
    { 
     return VisibilityIfFalse; 
    } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); // Not necessary 
    } 
} 

XAML:

<UserControl> 
    <UserControl.Resources> 
     <converters:BooleanToVisibilityConverter x:Key="TrueToVisibleConverter" VisibilityIfTrue="Visible" VisibleIfFalse="Collapsed"/> 
     <converters:BooleanToVisibilityConverter x:Key="FalseToVisibleConverter" VisibilityIfTrue="Collapsed" VisibleIfFalse="Visible"/> 
    </UserControl.Resources> 
</UserControl> 
... 
<DataTemplate> 
    <Grid Visibility="{Binding ShowIcon, FallbackValue=hidden}"> 
     <Image Source="/Resources/Images/circle_green.png" Visibility="{Binding InPossession, Converter={StaticResource TrueToVisibleConverter}}"/> 
     <Image Source="/Resources/Images/circle_red.png" Visibility="{Binding InPossession, Converter={StaticResource FalseToVisibleConverter}}"/> 
    </Grid> 
</DataTemplate> 
+0

感谢你们,虽然我还没有完全按照自己的需要进行排序。 – bucky112 2014-10-27 15:00:06

+0

我添加了代码来说明我关于真/假可见性转换器的想法 – sondergard 2014-10-27 15:19:28

+0

我在执行转换器逻辑的新属性时遇到困难我在看@ http://stackoverflow.com/questions/534575/how-do-i -invert-booleantovisibilityconverter但没有多少运气,你能提供一个例子吗? – bucky112 2014-10-27 15:45:27

1

尝试也指定枚举类型。

Value="{x:Static wpf:IconEnum.IconImage2}" 

wpf:就像是在我的情况xmlns:wpf="clr-namespace:Sandbox.WPF"命名空间。但是我可能会选择另一种解决方案,就像sondergard所说的那样,它比这种黑客更加干净。