2013-09-09 3 views
1

Я использую TreeView для отображения моих данных. Я хочу привязать передний план элемента древовидной структуры. Вот мой код ниже.TreeView элемент привязки переднего плана MVVM

Вид:

<UserControl.Resources> 
    <HierarchicalDataTemplate x:Key="TreeViewItem" ItemsSource="{Binding Children}"> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox Margin="2" IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding Title}" 
         Background="{Binding Path=ForegroundColor}" IsThreeState="True"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 
<Grid> 
    <TreeView Margin="5, 0, 5, 0" ItemsSource="{Binding GeoGraphixModules}" ItemTemplate="{StaticResource TreeViewItem}" IsEnabled="{Binding TreeViewEnabled}" /> 
</Grid> 

И на мой взгляд, модель

общественного класса SomeTreeViewItem { общественного Коллекция Дети { прибудете {вернуться _children; }}

public Brush ForegroundColor 
{ 
    get 
    { 
     if (SomeCheck) 
      return Brushes.Green; 
     else 
      return Brushes.Red; 
    } 
}  

}

Теперь, когда я отладка этого приложения «ForegroundColor» ударило, но приложение по-прежнему отображается черным, как передний план для всех дочерних элементов. В чем проблема?

+0

Привет, Faisal. Если вы отлаживаете это приложение, есть ли в вашем окне вывода ошибки привязки? –

+0

Ошибка System.Windows.Data: 1: Невозможно создать конвертер по умолчанию для выполнения односторонних конверсий между типами «System.Drawing.Brush» и «System.Windows.Media.Brush». Рассмотрите возможность использования свойства преобразования Binding. BindingExpression: Path = ForegroundColor; DataItem = 'GeoGraphixModule' (HashCode = 63453159); целевой элемент - «CheckBox» (Name = ''); target - «Background» (тип «Brush») –

ответ

0

После попытки создать такую ​​же ошибку я сделал следующее ViewModel

public class ViewModel 
{ 
    private Collection<GeoGraphixModule> _geoGraphixModules; 

    public ViewModel() 
    { 
     _geoGraphixModules = new Collection<GeoGraphixModule>(); 
     _geoGraphixModules.Add(new GeoGraphixModule(){Children = new Collection<Bla>(){new Bla{Children = new Collection<Bla>{new Bla(), new Bla(), new Bla()}}}}); 
     _geoGraphixModules.Add(new GeoGraphixModule(){Children = new Collection<Bla>(){new Bla{Children = new Collection<Bla>{new Bla(), new Bla(), new Bla()}}}}); 
     _geoGraphixModules.Add(new GeoGraphixModule(){Children = new Collection<Bla>(){new Bla{Children = new Collection<Bla>{new Bla(), new Bla(), new Bla()}}}}); 
     _geoGraphixModules.Add(new GeoGraphixModule(){Children = new Collection<Bla>(){new Bla{Children = new Collection<Bla>{new Bla(), new Bla(), new Bla()}}}}); 
    } 

    public Collection<GeoGraphixModule> GeoGraphixModules 
    { 
     get { return _geoGraphixModules; } 
     set { _geoGraphixModules = value; } 
    } 
} 

public class GeoGraphixModule 
{ 
    public Brush ForegroundColor 
    { 
     get 
     { 
      if (SomeCheck()) 
       return Brushes.Green; 
      return Brushes.Red; 
     } 
    } 

    private bool SomeCheck() 
    { 
     Random random = new Random(); 
     int randomNumber = random.Next(0, 100); 

     if ((randomNumber % 2) == 0) 
      return true; 
     return false; 
    } 

    private Collection<Bla> _children; 
    public Collection<Bla> Children { get; set; } 
} 

public class Bla 
{ 
    private bool? _isChecked; 
    private string _title; 
    private Collection<Bla> _children; 

    public bool? IsChecked 
    { 
     get { return _isChecked; } 
     set 
     { 
      _isChecked = value; 
     } 
    } 

    public Collection<Bla> Children 
    { 
     get { return _children; } 
     set { _children = value; } 
    } 

    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      _title = value; 
     } 
    } 
} 

его очень уродливый я знаю, но это работает на самом высоком уровне взять бабло на скрине

enter image description here