2010-02-22 4 views
1

Я довольно новыми для WPF поэтому извините за любой немой вопрос ...Как получить переплетены ListboxItems из ListView в WPF

У меня есть ListView с тремя столбцами, которые переплетены к источнику XmlDataProvider как следующее :

 <XmlDataProvider x:Key="Properties" XPath="/Info"> 
     <x:XData> 
      <Info xmlns=""> 
       <Property Name="Text" Value=""/>    <!--0--> 
       <Property Name="Tooltip" Value=""/>    <!--1--> 
       <Property Name="Enable" Value=""/>    <!--2--> 
       <Property Name="Visible" Value=""/>    <!--3--> 
       <Property Name="Focus" Value=""/>    <!--4--> 
       <Property Name="Selected" Value=""/>   <!--5--> 
       <Property Name="Count" Value=""/>    <!--6--> 
       <Property Name="Item" Value=""/>    <!--7--> 
       <Property Name="SelectedText" Value=""/>  <!--8--> 
       <Property Name="SelectedIndex" Value=""/>  <!--9--> 
       <Property Name="Complete" Value=""/>   <!--10--> 
      </Info> 
     </x:XData> 
    </XmlDataProvider> 

элемент управления ListView определяется следующим образом:

 <ListView Name="lstProperties" Margin="55 0 0 0" Style="{DynamicResource TsListView}" 
     Grid.Row="2" Grid.RowSpan="7" Grid.ColumnSpan="4" 
     ItemsSource="{Binding Source={StaticResource Properties}, XPath=Property}" 
     ItemContainerStyle="{DynamicResource TsListViewItem}" 
     ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
     SelectionMode="Single" IsEnabled="False" 
     SelectionChanged="propertySelected" 
     > 

     <ListView.View> 
      <GridView AllowsColumnReorder="False"> 
       <GridViewColumn CellTemplate="{StaticResource FirstCell}" Width="25" /> 
       <GridViewColumn Header="Property" Width="80"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <Label Style="{DynamicResource TsLabel}" Height="25" Width="115" Content="{Binding [email protected]}" /> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       <GridViewColumn Header="Value" Width="130"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox Style="{DynamicResource TsHelperTextBox}" 
            Height="20" Width="115" Text="{Binding [email protected]}" 
            IsEnabled="{Binding ElementName=rbTypeAssert, Path=IsChecked}" GotFocus="gridTextBox_GotFocus" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 

То, что я хочу сделать сейчас довольно просто: я просто хочу, чтобы включить/отключить некоторые из ListViewItems. Единственный способ, которым я нашел, чтобы получить ListViewItems через следующий метод:

lstProperties.ItemContainerGenerator.ContainerFromIndex(index) 

Это делает меня немного неудобно. Я должен получить Элементы с помощью свойства name свойства. Есть какой-либо способ сделать это? У меня также возникают проблемы, когда я пытаюсь сделать это сразу после инициализации окна. Я получаю исключение NullReferenceException при попытке отключить один из этих ListViewItems. Кажется, что сразу после визуализации окна привязка еще не завершена.

ответ

0

Ну ваша обратная связь, в сочетании с другими обратной связи, полученной , позволил мне решить проблему. Огромное спасибо!

Что я сделал, это добавить новый атрибут с именем IsEnable в Свойство в XmlDataProvider, а затем я привязал свойство IsEnabled к элементу ListViewItem к этому новому атрибуту. Поэтому вместо того, чтобы иметь одно глобальное свойство для определения состояния всех элементов ListViewItems, как вы сказали, у меня будут «индивидуальные привязки».

Чтобы изменить данные программно я использовал следующий метод:

provider.Document.SelectSingleNode("//Property[Name=\"Text\"]/IsEnable").InnerText = false.ToString(); 

Этот метод требует несколько иного формата данные. Таким образом, XmlDataProvider теперь выглядит следующим образом:

 <XmlDataProvider x:Key="Properties" XPath="/Info" IsAsynchronous="False" IsInitialLoadEnabled="True"> 
     <x:XData> 
      <Info xmlns=""> 
       <Property> 
        <Name>Text</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Tooltip</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Enable</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Visible</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Focus</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Selected</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Count</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Item</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>SelectedText</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>SelectedIndex</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
       <Property> 
        <Name>Complete</Name> 
        <Value></Value> 
        <IsEnable>true</IsEnable> 
       </Property> 
      </Info> 
     </x:XData> 
    </XmlDataProvider> 

Еще раз спасибо за ваш вклад! Хосе Таварес

1

Самый простой и лучший способ сделать это, чтобы выставить свойство, определяющее, должен ли ListViewItem быть включен или нет, а затем привязать к нему:

<ListView> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="IsEnabled" Value="{Binding YourProperty}"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 
+0

Спасибо, я думал о чем-то как это, но у меня было три проблемы с таким подходом. 1. Как определить пользовательское свойство (OK, это действительно вопрос новичков) 2. У меня уже есть стиль, определенный для всех элементов ListViewItems в моем приложении. Ваше решение означает, что я должен иметь определенный стиль для этих ListViewItems ?, и самое главное, 3. В этой конкретной ситуации мне нужно одно свойство для ListViewItem, а не одно общее свойство. Можно ли связать это с XmlDataSource? Спасибо – jpsstavares

1

Кенты ответ правильный, но я хотел бы использовать конвертер, вместо того, чтобы расширять свою модель:

<ListView> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="IsEnabled" Value="{Binding Converter={StaticResource IsEnabledConverter}}"/> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 

и преобразователь:

public class IsEnabledConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     //Implement your logic here, and return true/false accordingly 
     return true; 
    } 

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

    #endregion 
} 
+0

Ну, я вижу, что это работает, хотя я думаю, что предпочитаю решение, которое я получил, потому что привязка понятна и не требует дополнительного кода. Но спасибо за подсказку, это может быть полезно для меня в других ситуациях. – jpsstavares

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