尽管ObservableCollection(UWP,XAML)

时间:2016-08-11 03:16:09

标签: c# xaml uwp

我非常感谢我对这个约束性问题的一些帮助。基本上我有一个列表视图显示有关文件的一些信息。在列表视图项本身中,有一些文本和一个按钮。

单击此按钮时,我想禁用该按钮。

目前我已经设置了一个ObservableCollection - 但是即使正在注册按钮点击,UI也不会更新。如果我转到另一个屏幕并返回,然后 UI更新。所以这不是瞬间的。

我认为RaisePropertyChanged()的工作方式存在一些问题。我从阅读其他SO文章中了解到,对象中的属性更改比说,删除项目或向ListView添加项目更难获取。

我完全陷入困境,任何帮助都会非常感激。感谢。

的Xaml:

<ListView RelativePanel.Below="heading" ItemsSource="{Binding Pages}" ReorderMode="Enabled" CanReorderItems="True" AllowDrop="True" Margin="0,10" SelectedItem="{Binding Path=SelectedFile,Mode=TwoWay}" >
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="model:File">
            <Grid Padding="10">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="250"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{x:Bind Path= Name, Mode=TwoWay}" FontWeight="Bold" Padding="0,5"  />
                <TextBlock Text ="{x:Bind Path}" Grid.Row="1" TextWrapping="Wrap" Padding="10,0,0,0" Foreground="DarkGray" Opacity="0.8" />
                <Button Content="X" Grid.Column="1" Grid.RowSpan="2" Command="{x:Bind EnableCommand}" IsEnabled="{x:Bind Path=IsEnabled, Mode=OneWay}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

File.cs:

public class File : ViewModelBase
{
    public string Name { get; set; }
    public string FileName { get; set; }
    public string Path { get; set; }
    public string Contents { get; set; }

    private Boolean isEnabled = true;
    public Boolean IsEnabled {
        get { return isEnabled; }
        private set {
            isEnabled = value;
            RaisePropertyChanged("IsChecked");
        }
    }

    private ICommand enableCommand;
    public ICommand EnableCommand
    {
        get
        {
            if(enableCommand == null)
            {
                enableCommand = new RelayCommand(() => {
                    isEnabled = false;
                    Name += "Disabled";
                    RaisePropertyChanged();
                });
            }

            return enableCommand;
        }
    }
}

视图模型:

public class MyPageViewModel : BaseViewModel
{
    private ObservableCollection<File> pages;

    public ObservableCollection<File> Pages
    {
        get { return pages; }
        set
        {
            pages = value;
            RaisePropertyChanged();
        }
    }

    private File selectedFile = new File();
    public File SelectedFile
    {
        get { return selectedFile; }
        set
        {
            Set(ref selectedFile, value);
        }
    }

    public MyPageViewModel()
    {
        if (ApplicationData.FileList != null)
        {
            Pages = new ObservableCollection<File>(ApplicationData.FileList);
        }

        else
        {
            Pages = new ObservableCollection<File>();
        }
    }

1 个答案:

答案 0 :(得分:1)

您应该在通知IsChecked时通知IsEnabled

ObsevarvableCollection仅通知何时添加或删除某些内容。它所持有的对象的更改不会被通知。)