2015-06-05 3 views
3

мне довелось иметь необходимость связывать грид-х DataContext к SelectedItem Свойство а ListView вКак бросить в WPF

я мог бы сделать это без каких-либо проблем .... Однако, поскольку SelectedItem магазинов ListView в объект, тем Редактор XAML не знает тип, с которым он работает, что вызывает следующее предупреждение: «Невозможно разрешить свойство X в контексте данных типа« объект »

Можно ли указать в одном из привязок который набирает объект (я искал отливку WPF, но не нашел соответствующих ресурсов)

Вот соответствующая выдержка из моего XAML:

<ListView x:Name="ListView" ItemsSource="{Binding LoginScreens}" Grid.Column="0" Grid.Row="0" SelectionMode="Single"/> 
<Grid Grid.Column="1" Grid.Row="0" DataContext="{Binding SelectedItem, ElementName=ListView}"> 
    <Grid.RowDefinitions> 
     /*rows*/ 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     /*Columns*/ 
    </Grid.ColumnDefinitions> 
    <TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource TextBoxStyle}" Text="{Binding Name}"/> 
    <TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource TextBoxStyle}" Text="{Binding NameFr}"/> 
    <TextBox Grid.Row="2" Grid.Column="1" Style="{StaticResource TextBoxStyle}" IsEnabled="False" Text="{Binding Filename}"/> 
    <TextBox Grid.Row="3" Grid.Column="1" Style="{StaticResource TextBoxStyle}" IsEnabled="False" Text="{Binding SHA1}"/> 
</Grid> 

Я пробовал следующий синтаксис привязки текстового поля, который не работал:

<TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource TextBoxStyle}" Text="{Binding (manifestEditor:LoginScreen.Filename)}"/> 

Но это приводит к ошибке быть выброшен о ключе будучи нулевым в ListDictionary, так что либо я чего-то не хватает, либо это неправильный путь.

EDIT:

Я хотел бы как можно больше, чтобы использовать только XAML для обработки этой

+0

Это потому, что он не знает до тех пор, пока не исполнит, каким будет объект (хотя вы бы подумали, что это будет во многих случаях). Я просто игнорирую это. –

+0

Ну, мне просто интересно, так как я знаю, какой предмет будет у объекта, если бы я мог дать ему подсказку – Sidewinder94

+0

Правильно ли он связывается при запуске? – mariocatch

ответ

5

Ваш код отлично подходит для меня. Просто чтобы добавить что-то новое и полезное здесь это еще один способ определения связывания с SelectedItem:

<Grid> 
    <StackPanel> 
     <ListView x:Name="ListView" ItemsSource="{Binding LoginScreens}" 
        IsSynchronizedWithCurrentItem="True" 
        SelectionMode="Single"/> 
     <Grid DataContext="{Binding LoginScreens}"> 
      <StackPanel> 
       <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/> 
       <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding NameFr}"/> 
       <TextBox Grid.Row="2" Grid.Column="1" IsEnabled="False" Text="{Binding Filename}"/> 
       <TextBox Grid.Row="3" Grid.Column="1" IsEnabled="False" Text="{Binding SHA1}"/> 
      </StackPanel> 
     </Grid> 
    </StackPanel> 
</Grid> 

IsSynchronizedWithCurrentItem синхронизирует CurrentItem по умолчанию CollectionView связанного коллекции с SelectedItem вашего контроля за и выбирая DataContext из Grid как ObservableCollection LoginScreens, вы получите обновления в соответствии с выбором ListView.

+1

Это хороший, отлично работает, спасибо – Sidewinder94

0

DataBind в SelectedItem к ViewModel. Данную привязку к DataContext DataGrid к той же ViewModel. Пока ViewModel знает, с какими типами он работает, все должно работать хорошо.

+0

Я пытался найти способ избежать кода C# на этом и остаться в XAML :) добавит эту точность в вопрос – Sidewinder94

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