簡體   English   中英

在TabControl中將StaticResource與ItemSource混合

[英]StaticResource mixed with ItemSource in TabControl

我有一個UserControl。 在頂部,有一個全局參數,綁定到類MultiSliceCommand的靜態屬性。 在下面,有一個TabControl,由一個Template填充,並綁定到public static ObservableCollection<GroupContainer> groups ,這也是MultiSliceCommand一個屬性。 GroupContainer包含各種屬性,主要是double,int等,這些屬性在TabItems的文本框中顯示和可編輯。

現在,當我更改TabItem中的值時,將在正確的groups元素中設置相應的屬性。 但是,當我關閉並重新打開對話框時, groups中的所有GroupContainers都將重置為其默認值-即使該屬性在任何時候都未綁定到對話框。

正確保留對全局變量(在TabControl外部)的更改。 如果我刪除對全局變量的綁定,也可以正確保留對TabControl的更改-顯式地,如果我刪除行<local:MultiSliceCommand x:Key="mutliSliceCommand" /><TextBox x:Name="Mm_Per_Package" Text="{Binding Source={StaticResource mutliSliceCommand}, Path=Mm_Per_Package}" />

關閉和重新打開對話框時,如何更改綁定以保留對全局變量以及選項卡內容的更改?

Xaml文件:

<UserControl.Resources>
    <DataTemplate x:Key="HeaderTemplate">
        <Label Content="{Binding Group_Name}" />
    </DataTemplate>

    <local:MultiSliceCommand x:Key="mutliSliceCommand" />

    <DataTemplate x:Key="ItemTemplate">
        <Grid>
            <TextBox x:Name="_length" Text="{Binding Path=Length, UpdateSourceTrigger=PropertyChanged, Delay=0}"  />
        </Grid>
    </DataTemplate>
</UserControl.Resources>

<ScrollViewer>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <GroupBox
            Header="Global Parameters"
            Grid.Row="0"
            Grid.Column="0"
            >
            <Grid Height="Auto" Width="Auto">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>

                <TextBox x:Name="Mm_Per_Package" Text="{Binding Source={StaticResource mutliSliceCommand}, Path=Mm_Per_Package}" />
            </Grid>
        </GroupBox>

        <GroupBox
            Header="Materials"
            Grid.Row="1"
            Grid.Column="0"
            Grid.ColumnSpan="2"
            >
            <TabControl x:Name="TabControl1"
            HorizontalAlignment="Left" 
            VerticalAlignment="Top"
            ItemTemplate="{StaticResource HeaderTemplate}" 
            ContentTemplate="{StaticResource ItemTemplate}"
                        />
        </GroupBox>
        <!--
        <Button Content="Save settings"
            Grid.Row="2"
            HorizontalAlignment="Right"
            Margin="10,10,0,0"
            VerticalAlignment="Top"
            Width="75" 
            Click="Btn_Save"    />-->
    </Grid>
</ScrollViewer>

MultiSliceCommand

public class MultiSliceCommand
{
    public static ObservableCollection<GroupContainer> groups { get; set; }
    private static double _mm_per_package { get; set; } = 0;
    public static double Mm_Per_Package
    {
        get { return _mm_per_package; }
        set { _mm_per_package = value < 0 ? 0 : value; }
    }

    public MultiSliceCommand()
    {
       groups = new ObservableCollection<GroupContainer>
        {
            new GroupContainer("Group 1"),
            new GroupContainer("Group 1"),
            new GroupContainer("Group 3")
        };
    }  
}

ObjectContainer

public class GroupContainer : INotifyPropertyChanged
{
   private double _length { get; set; } = 0;


    public double Length
    {
        get { return _length; }
        set { _length = value < 0 ? 0 : value;  NotifyPropertyChanged("Min_Vector_Length"); }
    }

    // Methods
    public GroupContainer(string group_name)
    {
              }


    // Helper Stuff
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string sProp)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(sProp));
        }
    }
}

好的,使用(有些骯臟的)hack修復了它:

我只是將全局變量外包給自己的類,並將xaml綁定到此類。 MultiSliceCommand ,我在屬性上使用getter / setter來中繼“隔離類”中的值

隔離等級:

public class xaml_backend_variables
{
    private static double _mm_per_package = 0;
    public static double Mm_Per_Package
    {
        get { return _mm_per_package; }
        set { _mm_per_package = value < 0 ? 0 : value; }
    }

    public xaml_backend_variables()
    {

    }
}

MultiSliceCommand

 public static double Mm_Per_Package
    {
        get { return xaml_backend_variables.Mm_Per_Package; }
        set { xaml_backend_variables.Mm_Per_Package = value; }
    }

XAML修改

....
<local:xaml_backend_variables x:Key="xaml_backend_variables" />
....
<TextBox x:Name="Mm_Per_Package" Text="{Binding Source={StaticResource xaml_backend_variables}, Path=Mm_Per_Package}" />

但是現在,在關閉並重新打開對話框時,所有值都可以正確保留。

不過,如果有人能解釋為什么會發生這種情況,以及解決該問題的正確/優雅方法是什么,我非常想知道!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM