저는 XAML을 처음 접했지만 익숙하게 배우고 있습니다. 내가 정말로 고민하는 것은 DataTemplate
에있는 요소에 속성을 바인딩하는 것입니다.XAML : DataTemplate에서 속성 바인딩
내 문제를 설명하기 위해 간단한 WPF 예제를 만들었습니다.
이 예제에서는 에있는 CheckBox
의 Visibility
속성을 내 viewmodel의 속성에 바인딩하려고합니다. (이 시나리오를 사용하여 학습/데모 용으로 만 사용하십시오.)
간단한 데이터 모델 Item
이 있지만이 예제에서는별로 관련이 없습니다.
class Item : INotifyPropertyChanged
{
// Fields...
private bool _IsRequired;
private string _ItemName;
그리고 매우 간단한보기 모델 인 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"));
}
(생성자 및 간결성을 위해 생략 INotifyPropertyChanged
구현.) 다음에서 MainPage.xaml 뻗어
컨트롤.
<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>
'숨기기 확인란'확인란
IsCheckBoxChecked
에 바인딩 및
IsCheckBoxVisible
를 업데이트하는 데 사용됩니다. 나는 또한
DataTemplate
아래 몇 가지 추가 컨트롤을 추가하여 모든 것을 작동 함을 증명했습니다.
또한 Jeff Wilcox의 값 변환기도 구현했습니다. 데이터 템플릿 내부의 Checkbox
이 변경되지, 아아, 내가 응용 프로그램을 실행하면 DataTemplate
함수 외부 컨트롤이 예상대로 확인하고 '숨기기 확인란'을 선택 해제, http://www.jeff.wilcox.name/2008/07/visibility-type-converter/
을 (. 주셔서 감사합니다)하지만.
내가 성공 있었 :
IsVisible="{Binding IsChecked, Converter={StaticResource VisibilityConverter}, ElementName=checkBox}"
을하지만 난 그냥 다른 컨트롤을 모방하지만 값을 기준으로 의사 결정을 내릴려고하고 있지 않다.
제공 할 수있는 도움이나 조언에 정말로 감사드립니다.
감사합니다.
Visual Studio의 디버그 출력 창에 바인딩 오류가 있습니까? 그것들은 대개 잘못되는 것을 잘 보여줍니다. – ChrisF
Chris. 귀하의 회신에 감사드립니다. 출력 창을 점검했고, 의심되는 것처럼 오류가있었습니다. IsCheckBoxVisible을 찾을 수 없습니다. Duncan의 답변에 따라 적용된 수정 사항이 아래에 모두 나와 있습니다. 고맙습니다. – Dowse