2015-08-21 4 views
0

Предположим, у меня есть следующий класс:Bind Истинное значение SelectedValue в XAML

class SimpleData 
{ 
    public string DisplayName { get; set; } 
    public bool IsDefault { get; set; } 
} 

Теперь я уже хранится список SimpleData в списке и установите список в качестве DataContext. Я переплетены в светящуюся, как это:

<ComboBox x:Name="layoutComboBox" VerticalAlignment="Center" Padding="3,0,3,0" Height="20" Margin="3,0,0,0" MinWidth="100" 
ItemsSource="{Binding Path=GridConfigurationProfiles}" 
DisplayMemberPath="DisplayName" 
SelectedValuePath="IsDefault" 
/> 

Который работает довольно хорошо для DisplayMemberPath, но я не получить выбранный элемент по умолчанию, который имеет IsDefault = True.

Вопрос: как привязать SelectedValue к True, чтобы элемент был выбран, который имеет IsDefault = True. Если условие соответствует более чем одному элементу true, система должна принимать все, что захочет.

спасибо.

ответ

1

Подумайте об этом: IsDefault не является уникальным для каждого предмета. Итак, когда вы связываете SelectedValue, что должен делать ComboBox, если есть несколько элементов с IsDefault == true?

Кроме того, SelectedValue - это просто значение выбранного элемента ComboBox, который определяется SelectedValuePath.

Я бы рекомендовал вам связать SelectedItem, а не SelectedValue:

<ComboBox x:Name="layoutComboBox" VerticalAlignment="Center" Padding="3,0,3,0" Height="20" Margin="3,0,0,0" MinWidth="100" 
ItemsSource="{Binding Path=GridConfigurationProfiles}" 
DisplayMemberPath="DisplayName" 
SelectedValuePath="IsDefault" 
SelectedItem="{Binding SelectedConfigurationProfile, Mode=TwoWay}" 
/> 

В ViewModel:

private _selectedConfigurationProfile; 
public SimpleData SelectedConfigurationProfile 
{ 
    get { return _selectedConfigurationProfile; } 
    set 
    { 
     if (_selectedConfigurationProfile != value) 
     { 
      _selectedConfigurationProfile = value; 
      //NotifyPropertyChanged("SelectedConfigurationProfile"); if needed 
     } 
    } 
} 

public void MethodThatSetsDefault() 
{ 
    SelectedConfigurationProfile = GridConfigurationProfiles.FirstOrDefault(q => q.IsDefault); 
} 
+0

Вы правы, обладаете таким свойством, как 'SelectedProfile', более прямолинейным. Я просто пытался использовать 'IsDefault', потому что это колонка в нашей базе данных. Я изменил его на обычное свойство. – BendEg

+0

Работает отлично, но мне это не нужно: 'SelectedValuePath =" IsDefault "' любой режим. – BendEg

1

От MSDN

SelectedValuePath свойство задает путь к свойству который используется для определения значения свойства SelectedValue.

В основном это означает, что если вы установите свойство, как вы сделали SelectedValuePath="IsDefault"SelectedValue свойства будет значением IsDefault свойства выбранного элемента.

Что вам еще нужно сделать, так это предоставить значение SelectedValue так, чтобы оно инициализировало SelectedItem. Вы можете использовать привязку или просто установить для свойства значение true.

<ComboBox x:Name="layoutComboBox" 
      VerticalAlignment="Center" 
      Padding="3,0,3,0" 
      Height="20" 
      Margin="3,0,0,0" MinWidth="100" 
      ItemsSource="{Binding Path=GridConfigurationProfiles}" 
      DisplayMemberPath="DisplayName" 
      SelectedValuePath="IsDefault" 
      SelectedValue="True"/> 
-1

Попробуйте использовать нейтрализатор:

public class Converter:IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture) 
    { 
     IEnumerable<SimpleData> data=value as IEnumerable<SimpleData>; 
     if(data==null) return null; 
     else return data.First(x=>x.IsDefault); 
    } 

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

и Binding:

<local:Converter x:Key="converter"/> 
<ComboBox SelectedItem="{Binding 
      Converter="{StaticResource converter}}"/> 

или что-то подобное этому.

+0

Это не работает, и даже если это не так, это плохая форма ... Преобразователи значения используются в преобразованиях данных. Тем не менее, вы не делаете выбор по умолчанию или бизнес-логику в конвертерах, для этого у вас есть ViewModel и Models. –

+0

Спасибо за ваш комментарий.Я новичок и довольно неопытен в wpf, особенно в MVVM. Извините за плохой совет. – bakala12