2015-01-20 1 views
0

У меня есть окно списка, которое содержит метку и текстовое поле, которое пользователь может изменить. Содержимое окна списка определяется в шаблоне данных (внутри window.resources). Я хотел бы добавить границу для каждого элемента в списке, который был изменен с помощью конвертера booltovisibility.BoolToVisibilityConverter внутри window.resources

У меня возникли проблемы, потому что я пытаюсь установить преобразователь внутри window.resources.

Может ли кто-нибудь указать мне в правильном направлении?

вид Модель:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.SqlClient; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace MaintainPersonData 
{ 
    public class MaintainPersonViewModel 
    { 
     public MaintainPersonViewModel(ObservableCollection<PersonViewModel> personList) 
     { 
     } 

     public INotifyUser Notifier; 

     private ObservableCollection<PersonViewModel> _personList; 
     public ObservableCollection<PersonViewModel> PersonList 
     { 
      get 
      { 
       return _personList; 
      } 
      set 
      { 
       _personList = value; 
       OnPropertyChanged("PersonList"); 
      } 
     } 

     private bool _changesMade; 
     public bool ChangesMade 
     { 
      get 
      { 
       return _changesMade; 
      } 
      set 
      { 
       _changesMade = value; 
       OnPropertyChanged("ChangesMade"); 
      } 
     } 

     private bool _hasErrors; 
     public bool HasErrors 
     { 
      get { return _hasErrors; } 
      set 
      { 
       _hasErrors = value; 
       if (!_hasErrors) 
       { 
        ErrorMessage = ""; 
       } 
       OnPropertyChanged("HasErrors"); 
      } 
     } 

Xaml:

<Window.Resources> 
    <conv:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/> 

    <DataTemplate x:Key="ListBoxItemTemplate"> 
     <Border BorderBrush="LightGreen" BorderThickness="2" Visibility="{Binding ChangesMade, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource BoolToVisibilityConverter}}"> 
     <Grid> 
      <TextBox x:Name="PersonTextBox" Text="{Binding PersonName, UpdateSourceTrigger=PropertyChanged}"/> 
     </Grid> 
    </Border> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <ListBox x:Name="PersonListBox" SelectionMode="Single" KeyboardNavigation.TabNavigation="Continue" ItemTemplate="{StaticResource ListBoxItemTemplate}" ItemsSource="{Binding PersonList}"> 
     <!-- Code to highlight selected item (http://stackoverflow.com/questions/15366806/wpf-setting-isselected-for-listbox-when-textbox-has-focus-without-losing-selec) --> 
    </ListBox> 

    <!-- BoolToVisibilityConverter works perfectly here --> 
    <Label Name="ErrorLabel" Grid.Column="0" Foreground="Red" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding HasErrors, Converter={StaticResource BoolToVisibilityConverter}}" > 
      <TextBlock Text="{Binding ErrorMessage, UpdateSourceTrigger=PropertyChanged}" /> 
     </Label> 
    </Grid>  
</Window> 

И, наконец, преобразователь:

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Data; 

namespace MaintainRegexData 
{ 
    class BoolToVisibilityConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return (bool)value ? Visibility.Visible : Visibility.Collapsed; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
+0

уточните, в какой «неприятности» у вас есть – Arie

+0

после каждого изменения установите ваш «ChangesMade» равным True – safi

+1

'ChangesMade' должен быть определен для каждого' PersonViewMode' lt, потому что сейчас вы (или не будете) добавлять границы для всех элементов. Вы проверили, что метод 'Convert' из' BoolToVisibilityConverter' вызывается? И последнее - нет ничего плохого в настройке конвертера в ресурсах Windows. – rraszewski

ответ

1

ChangesMade должно определяться за каждый PersonViewMode Это потому, что сейчас вы (или не будете) добавлять границу ко всем элементам. Вы проверили, что метод Convert от BoolToVisibilityConverter вызывается? И последнее - нет ничего плохого в настройке конвертера в ресурсах Windows.

1

первую очередь вы связываете ваши ItemsSource к PersonList, который это тип является ObservableCollection<PersonViewModel> где ChangesMade включают в себя MaintainPersonViewModel, поэтому вам необходимо разместить свой ChangesMade внутри класса PersonViewModel и внести изменения, пока personName Недвижимость изменена.

и не забывайте, что @Frank сказал о границе.

Смежные вопросы