2010-02-22 2 views
1

에있는 ListView에서 ListboxItems를 바인더 제본하는 방법을 나는 는 WPF

나는 다음과 같은 XmlDataProvider 소스에 바인더 제본되는 세 개의 열이있는 목록보기가 ... WPF 그래서 어떤 바보 같은 질문에 대한 실례에 아주 새로운 해요 :

 <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 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) 

이 날 조금 불편합니다. 속성의 이름 속성을 통해 항목을 가져와야합니다. 이 작업을 수행 할 여지가 있습니까? 또한 창을 초기화 한 후에 바로이 작업을 수행하려고하면 문제가 발생합니다. 이러한 ListViewItem 중 하나를 사용하지 않도록 설정하려고하면 NullReferenceException이 발생합니다. 윈도우가 렌더링 된 직후 바인딩이 아직 완료되지 않은 것 같습니다.

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

답변

0

다른 피드백과 함께 귀하의 의견이 접수 :

1

이 작업을 수행하는 가장 쉽고 가장 좋은 방법은 ListViewItem가 활성화 여부를해야하는지 여부를 결정하는 속성을 노출 한 다음에 결합하는 것입니다 , 내가 문제를 해결하도록 허락했다. 매우 감사합니다!

IsEnable이라는 새 특성을 XmlDataProvider의 속성에 추가 한 다음 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> 

귀하의 기여에 다시 한 번 감사드립니다! 호세 타바레스

+0

감사합니다, 내가 뭔가 생각했습니다 이런 식으로 3 가지 문제가있었습니다. . 1. 어떻게 사용자 정의 속성 (OK 이것은 초보자 질문은 정말) 정의하는 2. 나는 이미 내 응용 프로그램의 모든 ListViewItems에 대해 정의 된 스타일을 가지고있다. 솔루션이 나는이 ListViewItems에 대한 특정 스타일을 가지고해야? 내가있는 ListViewItem 당 하나 개의 속성이 아니라 하나의 일반 속성을 필요로이 특정 상황에서 3, 가장 중요한 것을 의미한다. 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