0

問題があり、それが何であるかわかりません。コントロールにバインドする必要がある値を持つクラス内にクラスがあります。この場合は可視性です。コードは値を正しく変更していますが、出力は変更されません (つまり、コントロールが折りたたまれます)。

 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Orientation="Vertical">
            <Button x:Name="buttonOne" Content="Show Hide" Width="Auto" Click="buttonOne_Click"/>

        <ListBox x:Name="aListBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                            <TextBlock x:Name="blockOne" Grid.Column="0" Text="Raw "/>
                            <TextBlock x:Name="blockTwo" Grid.Column="1" Text="{Binding aValue}" Visibility="{Binding Path=visControl.VisibleState, BindsDirectlyToSource=True}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        </StackPanel>

    </Grid>

パブリック部分クラス MainPage : PhoneApplicationPage {

    private List<myClass> listOfClasses = new List<myClass>();
    // Constructor
    public MainPage()
    {

        myClass classA = new myClass("one");
        myClass classB = new myClass("two");
        myClass classC = new myClass("three");
        listOfClasses.Add(classA);
        listOfClasses.Add(classB);
        listOfClasses.Add(classC);


        InitializeComponent();
        aListBox.ItemsSource = listOfClasses;
    }

    private void buttonOne_Click(object sender, RoutedEventArgs e)
    {
        foreach (myClass cl in listOfClasses)
            if (cl.SwitchVisible)
                cl.SwitchVisible = false;
            else
                cl.SwitchVisible = true;
    }
}

public class myClass
{
    private string _aValue;
    private bool _switchVisible;

    public bool SwitchVisible { get { return _switchVisible; } set { _switchVisible = value; visControl.changeVisibility(_switchVisible); } }
    public string aValue { get { return _aValue; } }
    public controlProperties visControl;


    public myClass(string invalue)
    {
        visControl = new controlProperties();
        visControl.VisibleState = Visibility.Visible;
        _aValue = invalue;
    }

}

public class controlProperties
{
    private Visibility _visibility;


    public Visibility VisibleState { get { return _visibility; } set { _visibility = value; } }

    public void changeVisibility(bool isVisible)
    {
        if (isVisible)
            _visibility = Visibility.Visible;
        else
            _visibility = Visibility.Collapsed;
    }
}

これがパスの問題なのか拘束力のある問題なのか、何か考えはありますか?

4

1 に答える 1

1

プロパティの値を変更したときにコントロールを自動的に更新するには、クラスでINotifyPropertyChangedインターフェイスを実装する必要があります。

例えば:

public class controlProperties : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private Visibility _visibility;

    public Visibility VisibleState
    {
        get
        {
            return _visibility;
        }

        set
        {
            _visibility = value;
            this.NotifyPropertyChanged("VisibleState");
        }
    }

    public void changeVisibility(bool isVisible)
    {
        if (isVisible)
            this.VisibleState = Visibility.Visible;
        else
            this.VisibleState = Visibility.Collapsed;
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        var eventHandler = this.PropertyChanged;

        if (eventHandler != null)
        {
            eventHandler(sender, new PropertyChangedEventArgs(propertyName));
        }
    }
}
于 2012-11-02T15:00:52.223 に答える