代码之家  ›  专栏  ›  技术社区  ›  jpsstavares

如何从WPF中的ListView获取绑定的ListBoxItem

  •  1
  • jpsstavares  · 技术社区  · 14 年前

    我是WPF的新手,所以请原谅我有任何愚蠢的问题…

    我有一个列表视图,其中有三列绑定到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 XPath=@Name}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    <GridViewColumn Header="Value" Width="130">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Style="{DynamicResource TsHelperTextBox}"
                                         Height="20" Width="115" Text="{Binding XPath=@Value}" 
                                         IsEnabled="{Binding ElementName=rbTypeAssert, Path=IsChecked}" GotFocus="gridTextBox_GotFocus" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    

    我现在要做的相当简单:我只想启用/禁用一些ListViewItem。 我找到获取listviewitems的唯一方法是通过以下方法:

    lstProperties.ItemContainerGenerator.ContainerFromIndex(index)
    

    这让我有点不舒服。我应该通过属性的名称属性来获取这些项。有什么办法吗? 当我在初始化窗口后尝试执行此操作时,我也遇到了问题。当尝试禁用其中一个ListViewItem时,我得到一个NullReferenceException。窗口呈现之后,绑定似乎还没有完成。

    3 回复  |  直到 13 年前
        1
  •  1
  •   Arcturus    14 年前

    肯特的回答是正确的,但我会使用转换器,而不是扩展您的模型:

    <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
    }
    
        2
  •  1
  •   Tim Cooper    13 年前

    最简单和最好的方法是公开一个属性,该属性确定 ListViewItem 应启用或不启用,然后绑定到它:

    <ListView>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="IsEnabled" Value="{Binding YourProperty}"/>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
    
        3
  •  0
  •   jpsstavares    14 年前

    好吧,你的反馈,再加上其他收到的反馈,让我能够解决这个问题。非常感谢!

    我所做的是向xmldataProvider中的属性添加一个名为isEnable的新属性,然后将listViewItem的isEnabled属性绑定到此新属性。因此,不像您建议的那样,我将拥有“单个绑定”,而不是一个全局属性来定义所有ListViewItem的状态。

    为了以编程方式更改数据,我使用了以下方法:

    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>
    

    再次感谢您的贡献! 约瑟夫