2015-10-29 52 views
0

我想基于使用MVVM列表框项触发颜色变化

<Border Grid.Row="1" Width="300" Margin="0,0,20,0" BorderThickness="1,2,1,1" CornerRadius="5" BorderBrush="#FF999393" Background="#FFE9EDF1" > 
    <ListBox ItemsSource="{Binding LogMessageList, UpdateSourceTrigger=PropertyChanged}" Background="{x:Null}" Margin="3" BorderBrush="{x:Null}" FontSize="13.333" > 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
        <Setter Property="Foreground" Value="#FF403E3E" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding FatalError, UpdateSourceTrigger=PropertyChanged}" Value="Fatal"> 
         <Setter Property="Foreground" Value="Firebrick" /> 
         </DataTrigger> 
        </Style.Triggers> 
      </Style> 
     </ListBox.ItemContainerStyle>              
    </ListBox> 

我正确地设置属性的变化,但似乎没有任何一个触发改变项目的颜色列表框更改。

感谢

编辑: 仍停留。尝试

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Foreground" Value="#FF403E3E" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.FatalError, UpdateSourceTrigger=PropertyChanged}" Value="Fatal"> 
      <Setter Property="Foreground" Value="Firebrick" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</ListBox.ItemContainerStyle> 
+0

在输出窗口中是否有任何绑定失败记录?在用于LogMessageList集合的模型中定义了“FatalError”属性?如果是的话,你能否验证由设置者通知'PropertyChanged'事件? – user1672994

+0

好的电话。看起来像我正在使用目标类型listboxitem,然后绑定正在查看列表中的项目,而不是viewmodel上的“全局”属性。现在搞清楚了。 – scottsanpedro

+0

您可以使用RelativeSource来绑定您viewmodel的全局属性。 – user1672994

回答

0

试过你的情况。请参考下面的代码示例:

视图模型

public class Vm : INotifyPropertyChanged 
{ 
    public ObservableCollection<VmUser> VmUsers { get; set; } 

    private string errorType; 

    public string ErrorType 
    { 
     get { return errorType; } 
     set 
     { 
      errorType = value; 
      Raise("ErrorType"); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

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

public class VmUser 
{ 
    public string Name { get; set; } 

    public int Age { get; set; } 
} 

设置窗口的构造函数中DataContext

public MainWindow() 
    { 
     Vm = new Vm 
     { 
      VmUsers = new ObservableCollection<VmUser> 
      { 
       new VmUser { Name = "Gil", Age = 1 }, 
       new VmUser { Name = "Dan", Age = 2 }, 
       new VmUser { Name = "John", Age = 3 }, 
      }, 

      ErrorType = "Fatal" 
     }; 
     InitializeComponent(); 
     DataContext = TheVm; 
    } 

在XAML定义ListBox为:

<ListBox Grid.Row="2" ItemsSource="{Binding VmUsers}" DisplayMemberPath="Name" SelectedValuePath="Age"> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="ListBoxItem"> 
        <Setter Property="Foreground" Value="#FF403E3E" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext.ErrorType, UpdateSourceTrigger=PropertyChanged}" Value="Fatal"> 
          <Setter Property="Foreground" Value="Red" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ListBox.ItemContainerStyle> 
     </ListBox> 

为了测试th e我已经写了一个小测试来切换错误类型,点击按钮

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var vm = this.DataContext as Vm; 
    if (vm != null) 
    { 
     if (vm.ErrorType == "Fatal") 
     { 
      vm.ErrorType = "Non Fatal"; 
     } 
     else 
     { 
      vm.ErrorType = "Fatal"; 
     } 
    } 
} 

上面的例子中前景色根据ErrorType改变。

+0

哇,这是longwinded。非常感谢您的帮助。直到我改变了AncestorType = {x:Type ListBox}},我实际上无法工作。非常感谢。 – scottsanpedro

+0

你可以设置答案,我会接受它。 – scottsanpedro

+0

注意:我在一个userControl中。所以这将有效。 – scottsanpedro