Heisenberg
Heisenberg

Reputation: 776

initialize a WPF with undefined datatype

Here is a class with undefined variable that needs to be passed into the WPF window.

 public class SelectedVal<T>
{        
    public T val {get;set;}       
}

Window:

public partial class SOMEDialogue : Window
{
   public List<SelectedVal<T>> returnlist { get { return FullList; } }
   public List<SelectedVal<T>> FullList = new List<SelectedVal<T>>();       

   public SOMEDialogue (List<SelectedVal<T>> inputVal)
    {
       InitializeComponent();
     }

 }

So here is the question, how can I do this properly to get the T and have a global variable set in my WPF?

Edited (code edited too):

The purpose for the WPF is:

Upvotes: 0

Views: 174

Answers (1)

This is the basic idea I'm describing. Let me know if you hit any snags. I'm guessing that the search text and the min/max int values are properties of the dialog as a whole. I'm also assuming that there may be a mixture of item types in the collection, which may be an assumption too far. Can you clarify that?

Selected value classes

public interface ISelectedVal
{
    Object Val { get; set; }
}
public class SelectedVal<T> : ISelectedVal
{
    public T Val { get; set; }

    object ISelectedVal.Val
    {
        get => this.Val;
        set => this.Val = (T)value;
    }
}
public class StringVal : SelectedVal<String>
{
}
public class IntVal : SelectedVal<int>
{
}

Dialog Viewmodel

public class SomeDialogViewModel : ViewModelBase
{
    public SomeDialogViewModel(List<ISelectedVal> values)
    {
        FullList = values;
    }

    public List<ISelectedVal> FullList { get; set; }

    private String _searchText = default(String);
    public String SearchText
    {
        get { return _searchText; }
        set
        {
            if (value != _searchText)
            {
                _searchText = value;
                OnPropertyChanged();
            }
        }
    }

    private int _minInt = default(int);
    public int MinInt
    {
        get { return _minInt; }
        set
        {
            if (value != _minInt)
            {
                _minInt = value;
                OnPropertyChanged();
            }
        }
    }

    private int _maxInt = default(int);
    public int MaxInt
    {
        get { return _maxInt; }
        set
        {
            if (value != _maxInt)
            {
                _maxInt = value;
                OnPropertyChanged();
            }
        }
    }
}

.xaml.cs

public SOMEDialogue (List<ISelectedVal> inputValues)
{
    InitializeComponent();
    DataContext = new SomeDialogViewModel(inputValues);
}

XAML

<Window.Resources>
    <DataTemplate DataType="{x:Type local:StringVal}">
        <StackPanel>
            <Label>Value</Label>
            <Label Content="{Binding Val}" />
            <Label>Search text:</Label>

            <TextBox Text="{Binding DataContext.SearchText, RelativeSource={RelativeSource AncestorType=Window}}" />
            <!-- Other stuff -->
        </StackPanel>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:IntVal}">
        <StackPanel>
            <Label>Value</Label>
            <Label Content="{Binding Val}" />
            <Label>Min value:</Label>
            <TextBox Text="{Binding DataContext.MinIntVal, RelativeSource={RelativeSource AncestorType=Window}}" />
            <Label>Max value:</Label>
            <TextBox Text="{Binding DataContext.MaxIntVal, RelativeSource={RelativeSource AncestorType=Window}}" />
            <!-- Other stuff -->
        </StackPanel>
    </DataTemplate>
</Window.Resources>
<Grid>
    <ItemsControl
        ItemsSource="{Binding FullList}"
        />
</Grid>

Upvotes: 2

Related Questions