2009-08-24 2 views
0

У меня есть ListView в Windows Form, с которым я связываю список объектов при создании формы. То, что я хотел бы сделать, - это щелкнуть кнопкой мыши по элементам, которые были созданы, и изменить их свойство IsEnabled на false. Я пробовал два метода, и ни один из них не был особенно успешным. Может ли кто-нибудь помочь исправить эти проблемы и/или предложить альтернативный метод?Looping через WPF ListView DateTemplate Items

Моего ListView XAML

<ListView Margin="6" Name="myListView" ItemsSource="{Binding Path=.}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="10"/> 
       <ColumnDefinition Width="350"/> 
       <ColumnDefinition Width="20"/> 
       <ColumnDefinition Width="350"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="30" /> 
       <RowDefinition Height="30" /> 
       <RowDefinition Height="30" /> 
      </Grid.RowDefinitions> 
      <TextBlock Name="ItemNameTextBlock" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="4" VerticalAlignment="Center" Text="{Binding Path=ItemName}" /> 
      <CheckBox Name="Action1CheckBox" Grid.Row="1" Grid.Column="1" Content="Action1" IsChecked="True" /> 
      <CheckBox Name="Action2CheckBox" Grid.Row="1" Grid.Column="3" Content="Action2" IsChecked="True" /> 
      <TextBox Height="23" Name="MyInputTextBox" Grid.Row="2" Grid.Column="1" Margin="2,0,2,0" VerticalAlignment="Top" Width="25" Text="{Binding Path=DataValue}" />           
     </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Цель: На нажатии кнопки (кнопки переключения несвязанного) отключить CheckBoxes и TextBox

Попытка 1: Это не сработало, то товары являются привязкой к данным и я не могу понять, как добраться до самих элементов управления, чтобы сделать что-то подобное. Возможно ли это?

foreach (var item in ReleaseDeployProcessListView.Items) 
{ 
    ((CheckBox)item.FindControl("Action1CheckBox")).IsEnabled = false; 
} 

Попытка 2: Я добавил общественную собственность «IsFormElementsEnabled» в форме и на кнопку мыши установите это значение ложь. Но я не мог понять, как/если/что мне нужно сделать, чтобы связать это с элементами. Я попробовал IsEnabled = "{Binding Path = IsFormElementsEnabled} (который не работает, поскольку он привязан к объектам и не является участником этих объектов), и я попробовал IsEnabled =" {Binding Path = this.IsFormElementsEnabled} (что doesn похоже, не работает)

ответ

2

Вы всегда можете добавить логическое на ViewModel и связать его с вашей CheckBox?

Итак, представьте следующее логическое значение на вашем View Model:

public bool CanEdit 
{ 
    get 
    { 
     return canEdit; 
    } 
    set 
    { 
     canEdit = value; 
     NotifyPropertyChanged("CanEdit"); 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 
private void NotifyPropertyChanged(string info) 
{ 
    if (this.PropertyChanged != null) 
    { 
     this.PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
} 

Также обратите внимание, что ваш ViewModel должен реализовать интерфейс INotifyPropertyChanged

Затем связать этот булево с флажком в вашем DataTemplate

<CheckBox Name="Action1CheckBox" Grid.Row="1" Grid.Column="1" Content="Action1" IsChecked="True" IsEnabled="{Binding CanEdit}" /> 

И в вашей петле для петли логическое значение для CanEdit неверно:

foreach (var item in ReleaseDeployProcessListView.Items) 
{ 
    item.CanEdit = false; 
} 
+0

Да, это, безусловно, работать, я действительно надеюсь, что я мог бы получить одну из двух другихов механизмы для работы. – ChrisHDog

+1

См. Мой новый ответ;) Хотя я по-прежнему предпочитаю этот метод, хотя :) – Arcturus

2

Ok вот как сделать оба ваши решения работают;)

Покушение один:

foreach (var item in ReleaseDeployProcessListView.Items) 
{ 
    ListViewItem i = (ListViewItem) ReleaseDeployProcessListView.ItemContainerGenerator.ContainerFromItem(item); 

    //Seek out the ContentPresenter that actually presents our DataTemplate 
    ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(i); 

    CheckBox checkbox = (CheckBox)i.ContentTemplate.FindName("Action1CheckBox", contentPresenter); 
    checkbox.IsEnabled = false; 
} 


private T FindVisualChild<T>(DependencyObject obj) 
    where T : DependencyObject 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
     if (child != null && child is T) 
      return (T)child; 
    } 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
     T childOfChild = FindVisualChild<T>(child); 
     if (childOfChild != null) 
      return childOfChild; 
    } 

    return null; 
} 

Покушение два:

Dependency собственности на основной контроль:

public bool IsFormElementsEnabled 
{ 
    get { return (bool)GetValue(IsFormElementsEnabledProperty); } 
    set { SetValue(IsFormElementsEnabledProperty, value); } 
} 

public static readonly DependencyProperty IsFormElementsEnabledProperty = 
    DependencyProperty.Register("IsFormElementsEnabled", typeof(bool), typeof(YourClass), new PropertyMetadata(true)); 

Затем используйте RelativeSource привязки к главному классу в ваших управлении CheckBox:

<CheckBox Name="Action1CheckBox" Grid.Row="1" Grid.Column="1" Content="Action1" IsChecked="True" 
      IsEnabled="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:YourControl}}, Path=IsFormElementsEnabled}" /> 

Как вы можете видеть, многие дороги ведут в Рим;) Я предпочел бы использовать первый вариант, хотя, потому что это может быть что-то часть из бизнеса-логики, например, логической переменной, которая определяет, является ли клиент уже заплатил или что-то подобное: CustomerHasPaid

Надеется, что это помогает

+0

Большое спасибо Арктур, отличный ответ на мой вопрос. Я согласен, что другой ответ, вероятно, лучше (и я отметил его как правильно), но мне было очень любопытно, как эти два других метода могут быть выполнены. Еще раз спасибо! – ChrisHDog

+0

Без проблем .. рад, что я мог бы помочь;) – Arcturus