Jestem całkiem nowym użytkownikiem XAML, ale czerpię przyjemność z nauki. Rzeczą, z którą naprawdę walczę jest wiązanie właściwości elementu w DataTemplate
.XAML: Wiązanie właściwości w DataTemplate
Stworzyłem prosty przykład WPF, aby (mam nadzieję) wyjaśnić mój problem.
W tym przykładzie próbuję powiązać właściwość Visibility
z CheckBox
w DataTemplate
z właściwością w moim modelu widokowym. (Używając tego scenariusza wyłącznie do nauki/demonstracji.)
Mam prosty model danych o nazwie Item
, ale ma on niewielkie znaczenie w tym przykładzie.
class Item : INotifyPropertyChanged
{
// Fields...
private bool _IsRequired;
private string _ItemName;
A dość prosty model widoku o nazwie ItemViewModel.
class ItemViewModel : INotifyPropertyChanged
{
private ObservableCollection<Item> _Items;
private bool _IsCheckBoxChecked;
private bool _IsCheckBoxVisible;
public ObservableCollection<Item> Items
{
get { return _Items; }
set { _Items = value; }
}
public bool IsCheckBoxChecked
{
get { return _IsCheckBoxChecked; }
set
{
if (_IsCheckBoxChecked == value)
return;
_IsCheckBoxChecked = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("IsCheckBoxChecked"));
PropertyChanged(this, new PropertyChangedEventArgs("IsCheckBoxVisible"));
}
}
}
public bool IsCheckBoxVisible
{
get { return !_IsCheckBoxChecked; }
set
{
if (_IsCheckBoxVisible == value)
return;
_IsCheckBoxVisible = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("IsCheckBoxVisible"));
}
(Konstruktorzy i INotifyPropertyChanged
realizacja pominięte dla zwięzłości.)
Kontrole określone w MainPage.xaml następująco.
<Window.Resources>
<local:VisibilityConverter x:Key="VisibilityConverter"/>
</Window.Resources>
<Window.DataContext>
<local:ItemViewModel/>
</Window.DataContext>
<Grid>
<StackPanel>
<CheckBox x:Name="checkBox" Content="Hide CheckBoxes" FontSize="14" IsChecked="{Binding IsCheckBoxChecked, Mode=TwoWay}" />
<ListView ItemsSource="{Binding Items}" HorizontalContentAlignment="Stretch" >
<ListView.ItemTemplate >
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ItemName}"/>
<CheckBox Grid.Column="1" Visibility="{Binding IsCheckBoxVisible, Converter={StaticResource VisibilityConverter}}" >
<CheckBox.DataContext>
<local:ItemViewModel/>
</CheckBox.DataContext>
</CheckBox>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackPanel Orientation="Horizontal" Margin="4,4,0,0">
<TextBlock Text="IsCheckBoxVisible:"/>
<TextBlock Text="{Binding IsCheckBoxVisible}" Margin="4,0,0,0" FontWeight="Bold" />
</StackPanel >
<Button Content="Button" Visibility="{Binding IsCheckBoxVisible, Converter={StaticResource VisibilityConverter}}" Margin="4,4,4,4"/>
</StackPanel>
</Grid>
pole wyboru „Ukryj pola wyboru” jest zobowiązany do IsCheckBoxChecked
i służy do aktualizacji IsCheckBoxVisible
. Dodałem także kilka dodatkowych elementów sterujących poniżej DataTemplate
, aby udowodnić (samemu), że wszystko działa.)
Zaimplementowałem także konwerter wartości Jeffa Wilcoxa. (Dziękuję.) http://www.jeff.wilcox.name/2008/07/visibility-type-converter/
Kiedy uruchomić aplikację, sprawdzając i odznaczając pole „Ukryj”, kontrole poza funkcją DataTemplate
jak oczekiwano, ale, niestety, Checkbox
wewnątrz szablonu danych pozostaje niezmieniona.
miałem sukces:
IsVisible="{Binding IsChecked, Converter={StaticResource VisibilityConverter}, ElementName=checkBox}"
Ale nie tylko próbuje naśladować inną kontrolę, ale podejmować decyzje w oparciu o wartości.
NAPRAWDĘ doceniam każdą pomoc lub poradę, którą możesz zaoferować.
Dziękuję.
Czy występują błędy wiązania w oknie wyników debugowania w programie Visual Studio? Zazwyczaj są one dobrym wskaźnikiem tego, co dzieje się źle. – ChrisF
Chris. Dziękuję za odpowiedź. Sprawdzono okna wyjściowe i, jak podejrzewasz, wystąpiły błędy. Nie może "znaleźć" IsCheckBoxVisible. Zastosowana poprawka zgodnie z odpowiedzią Duncana poniżej i wszystko dobrze teraz. Dziękuję Ci. – Dowse