Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:未能清除列表中的项目(&F);添加新频道_C#_Wpf_List_Button_Mvvm - Fatal编程技术网

C# WPF:未能清除列表中的项目(&F);添加新频道

C# WPF:未能清除列表中的项目(&F);添加新频道,c#,wpf,list,button,mvvm,C#,Wpf,List,Button,Mvvm,我正在WPF中开发一个应用程序,我应该在其中动态生成UI组件并对其执行一些操作。我的做法如下: XAML: <Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="170" /> &

我正在WPF中开发一个应用程序,我应该在其中动态生成UI组件并对其执行一些操作。我的做法如下:

XAML:

<Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}">            
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170" />
        <ColumnDefinition />
        <ColumnDefinition Width="130" />
        <ColumnDefinition Width="115" />
    </Grid.ColumnDefinitions>

    <Label Grid.Column="0" Content="{Binding ChannelName}" />
    <TextBox Grid.Column="1" Text="{Binding VoltageText}" />
    <Button Grid.Column="1" Content="Set" CommandParameter="{Binding VoltageText}" Command="{Binding VoltageCommand}" />
    <Label Grid.Column="2" Content="{Binding CurrentText}"  />
    <ToggleButton Grid.Column="3" Content="On" />
</Grid>

<Button Content="Bavaria" Name="BavariaBtn" Click="BavariaBtn_Click" />
public void OnChildAdd()
    {            
        foreach (VoltageBoardChannel mVoltageChannelViewModel in mVoltageViewModel.VoltageChannelList)
        {
            VoltageChannelView mVoltageChannelView = new VoltageChannelView();
            mVoltageChannelView.Margin = new Thickness(2);
            mVoltageChannelView.ChannelInfo = mVoltageChannelViewModel;
            //Some Code to add the item
        }
    }

    private void BavariaBtn_Click(object sender, RoutedEventArgs e)
    {
        VoltageViewModel mVoltageViewModel = new VoltageViewModel();

        // Here List should get cleared and Bavaria 2 items should be added
        mVoltageViewModel.VoltageChannelList.Clear();
        mVoltageViewModel.VoltageChannelList = mVoltageViewModel.bavaria2Channels;            
        OnChildAdd();
    }      
public List<VoltageBoardChannel> channelList = null;        

    public List<VoltageBoardChannel> bavaria2Channels = new List<VoltageBoardChannel>
    {
         new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__IO__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__CODEC__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__DAL__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__DPD__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__PLL__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__AMP1__AUD", IsAvailable = true},
    };

    private ICommand m_voltageCommand;        

    public List<VoltageBoardChannel> bavaria1Channels = new List<VoltageBoardChannel>
    {
         new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__IO", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__CODEC", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__LDO", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__AMP", IsAvailable = true},  
    };            

    public VoltageViewModel()
    {
        channelList = new List<VoltageBoardChannel>(0);
        channelList = bavaria1Channels;            
        m_voltageCommand = new DelegateVoltageCommand(x => SetCommandExecute(x));            
    }

    public List<VoltageBoardChannel> VoltageChannelList
    {
        get 
        { 
            return channelList; 
        }

        set
        { 
            channelList = value;
            OnPropertyChanged("ChannelList");
        }
    }
private string mChannelName;
    public string ChannelName
    {
        get
        {
            return mChannelName;
        }
        set
        {
            mChannelName = value;
            OnPropertyChanged("ChannelName");
        }
    }

    private bool mIsAvailable;
    public bool IsAvailable
    {
        get
        {
            return mIsAvailable;
        }
        set
        {
            mIsAvailable = value;
            OnPropertyChanged("IsAvailable");
        }
    }        

    public ICommand VoltageCommand { get; set; }
视图模型:

<Grid Visibility="{Binding IsAvailable, Converter={StaticResource booltovisibility}}">            
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="170" />
        <ColumnDefinition />
        <ColumnDefinition Width="130" />
        <ColumnDefinition Width="115" />
    </Grid.ColumnDefinitions>

    <Label Grid.Column="0" Content="{Binding ChannelName}" />
    <TextBox Grid.Column="1" Text="{Binding VoltageText}" />
    <Button Grid.Column="1" Content="Set" CommandParameter="{Binding VoltageText}" Command="{Binding VoltageCommand}" />
    <Label Grid.Column="2" Content="{Binding CurrentText}"  />
    <ToggleButton Grid.Column="3" Content="On" />
</Grid>

<Button Content="Bavaria" Name="BavariaBtn" Click="BavariaBtn_Click" />
public void OnChildAdd()
    {            
        foreach (VoltageBoardChannel mVoltageChannelViewModel in mVoltageViewModel.VoltageChannelList)
        {
            VoltageChannelView mVoltageChannelView = new VoltageChannelView();
            mVoltageChannelView.Margin = new Thickness(2);
            mVoltageChannelView.ChannelInfo = mVoltageChannelViewModel;
            //Some Code to add the item
        }
    }

    private void BavariaBtn_Click(object sender, RoutedEventArgs e)
    {
        VoltageViewModel mVoltageViewModel = new VoltageViewModel();

        // Here List should get cleared and Bavaria 2 items should be added
        mVoltageViewModel.VoltageChannelList.Clear();
        mVoltageViewModel.VoltageChannelList = mVoltageViewModel.bavaria2Channels;            
        OnChildAdd();
    }      
public List<VoltageBoardChannel> channelList = null;        

    public List<VoltageBoardChannel> bavaria2Channels = new List<VoltageBoardChannel>
    {
         new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__IO__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__CODEC__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__DAL__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__DPD__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__PLL__AUD", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__AMP1__AUD", IsAvailable = true},
    };

    private ICommand m_voltageCommand;        

    public List<VoltageBoardChannel> bavaria1Channels = new List<VoltageBoardChannel>
    {
         new VoltageBoardChannel { ChannelName = "VDD__MAIN", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__IO", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__CODEC", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__LDO", IsAvailable = true},
         new VoltageBoardChannel { ChannelName = "VDD__AMP", IsAvailable = true},  
    };            

    public VoltageViewModel()
    {
        channelList = new List<VoltageBoardChannel>(0);
        channelList = bavaria1Channels;            
        m_voltageCommand = new DelegateVoltageCommand(x => SetCommandExecute(x));            
    }

    public List<VoltageBoardChannel> VoltageChannelList
    {
        get 
        { 
            return channelList; 
        }

        set
        { 
            channelList = value;
            OnPropertyChanged("ChannelList");
        }
    }
private string mChannelName;
    public string ChannelName
    {
        get
        {
            return mChannelName;
        }
        set
        {
            mChannelName = value;
            OnPropertyChanged("ChannelName");
        }
    }

    private bool mIsAvailable;
    public bool IsAvailable
    {
        get
        {
            return mIsAvailable;
        }
        set
        {
            mIsAvailable = value;
            OnPropertyChanged("IsAvailable");
        }
    }        

    public ICommand VoltageCommand { get; set; }
您可以注意到,在ViewModel类中,Bavaria 1在启动时显示。这里我主要想清除这些项目,然后在
BavariaBtn_Click()
上显示Bavaria 2项目,如xaml.cs类所示。我正在尝试这样做,但是列表没有被清除,尽管项目正在被添加


我怎样才能实现它?:)

简单列表不发送有关其元素更改的通知。它不实现
INotifyCollectionChanged
接口

observeablecollection
使用
ObservableCollection
而不是您的VoltageChannelList属性的列表,然后
不需要更改属性(“VoltageChannelList”)在setter中,您正在清除一个局部变量。XAML不知道您已经这样做了,事实上除了方法本身之外,没有人知道您已经清除了局部变量:

// Nobody knows the trouble I've seen...
VoltageViewModel mVoltageViewModel = new VoltageViewModel();

// Here List should get cleared and Bavaria 2 items should be added
mVoltageViewModel.VoltageChannelList.Clear();
MVVM清除列表的方法是向视图模型添加一个Clear命令:

public ICommand ClearCommand { get; private set; }

// ...

public VoltageViewModel(...)
{
    // ...
    this.ClearCommand = new DelegateCommand(
        () => this.VoltageChannelList.Clear(),
        () => this.VoltageChannelList.Count > 0);
}
然后在XAML中:

<Button Content="Bavaria" x:Name="BavariaBtn" Command="{Binding ClearCommand}" />

首先。。。您确实需要使用ObservableCollection。该列表不会像@Miklos所说的那样发送通知

第二,当你这样做时:

mVoltageViewModel.VoltageChannelList = mVoltageViewModel.bavaria2Channels;
您正在删除VoltageChannelList列表。你不能这样做。您必须在列表上迭代并手动复制项目

private void BavariaBtn_Click(object sender, RoutedEventArgs e)   
    {   
        VoltageViewModel mVoltageViewModel = new VoltageViewModel();   

        // Here List should get cleared and Bavaria 2 items should be added   
        mVoltageViewModel.VoltageChannelList.Clear();   

        foreach (VoltageBoardChannel channel in  mVoltageViewModel.bavaria2Channels) 
            mVoltageViewModel.VoltageChannelList.Add(channel);
    }  

谢谢你的回复。我用
ObservableCollection
试过了,但还是没有在点击按钮时清除列表。谢谢你的回复。我试过了,但仍然没有清除项目或添加新项目。注意:我的.cs文件中已经有了
BavariaBtn\u Click()
,现在如果我使用
命令
,你不认为这会导致歧义吗???我试过了,点击按钮,似乎什么也没发生。既然您推荐clearcommand,我们如何既清除列表又添加新频道?