2012-04-06 2 views
0

Я пытаюсь привязать TextBox к значению из коллекции классов. Как мне это сделать?Условное переплетение?

данных:

Name, Filter 
A , 1 
B , 2 
C , 3 

Теперь я хочу, чтобы заполнить мой TextBlock с фильтром, где Name = A.

XAML

<TextBlock Text="{Binding [Filters.??.Filter where name =??], UpdateSourceTrigger=PropertyChanged}"></TextBlock> 

Binding в Список ColumnFilter

public class Model 
{ 
    private ObservableCollection<DataGridColumnFilter> _filters = new ObservableCollection<DataGridColumnFilter>(); 
    public ObservableCollection<DataGridColumnFilter> Filters { get { return _filters; } set { _filters = value; } } 
} 
public class DataGridColumnFilter 
{ 
    public string Name { get; set; } 
    public string Filter { get; set; } 
} 
+0

Что вы ожидаете этого магического переплета делать? Какую версию SL вы используете? – Gabe

+0

Отредактировал вопрос –

ответ

2

Вы должны SE конвертер:

<Page.Resources> 
    <Samples:FilterConverter x:Key="FilterConverter"/> 
</Page.Resources> 

<Grid> 
    <TextBox Text="{Binding Path=Filters, 
     Converter={StaticResource FilterConverter}, 
     ConverterParameter=a, Mode=OneWay}"/> 
</Grid> 


public class ConditionalBindingVM 
{ 
    public ConditionalBindingVM() 
    { 
     Filters = new ObservableCollection<ColumnFilter> 
         { 
          new ColumnFilter {Name = "a", Filter = "filter A"}, 
          new ColumnFilter {Name = "b", Filter = "filter B"}, 
          new ColumnFilter {Name = "c", Filter = "filter C"}, 
         }; 
    } 

    public IEnumerable<ColumnFilter> Filters { get; private set; } 
} 

public class ColumnFilter 
{ 
    public string Name { get; set; } 
    public string Filter { get; set; } 
} 

public class FilterConverter : IValueConverter 
{ 
    #region Implementation of IValueConverter 

    public object Convert(object value, Type targetType, 
          object parameter, CultureInfo culture) 
    { 
     var filters = (IEnumerable<ColumnFilter>) value; 
     var name = (string) parameter; 

     var filter = filters.SingleOrDefault(f => f.Name == name); 

     return filter != null ? filter.Filter : string.Empty; 
    } 

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

    #endregion 
} 
0

Используйте событие KeyUp и сделать это (используя System.Linq):

myTextBox.Text= Filters.FirstOrDefault(c=> c.Name.StartsWith(myTextBox.Text)).Filter; 
Смежные вопросы