Ответы пользователя по тегу WPF
  • Как создать фильтрацию в привязанной коллекции в WPF?

    k1lex
    @k1lex
    Программист торг. сети. C# (WPF, WinForms), T-SQL
    Могу предложить решение, которое сам найдя на просторах сети начал использовать и остался доволен.
    1. Заводим коллекцию, которая будет у нас источником
    public ObservableCollection<Person>  FilteredCollection
            {
                get
                {
       return  new ObservableCollection<Person>(PersonCollection.Where(i => FilteredCheck(i)));
                }
            }

    2.
    public bool FilteredCheck(DemandHead item)
            {
                bool Accept=true;
    // организовываем проверку как вашей душе удобно
    }
    
    // И дальше при изменении фильтра оповещаем View об изменении данных
            public bool IsFilterEnabled
            {
                get
                {
                    return _IsFilterEnabled;
                }
    
                set
                {
                    _IsFilterEnabled = value;
                    base.OnPropertyChanged("IsFilterEnabled");
                    base.OnPropertyChanged("FilteredCollection");
    
                }
            }
    Ответ написан
    Комментировать
  • Как настроить получение дополнительных свойств при использовании "своего" контрола?

    k1lex
    @k1lex Автор вопроса
    Программист торг. сети. C# (WPF, WinForms), T-SQL
    На часть вопроса я всё таки нашел ответ самостоятельно.
    StringFormat не подхватывался, потому что при создании DependencyProperty у свойства "Value" использовался тип object. А StringFormat используется только для типа String. В виду того, что этот компонент нужен мне только для чтения, я поменял typeof(object) на typeof(string) и всё стало работать как нужно.
    Нормальным решением это конечно не назовешь. Но как говорил один герой в старом и добром мультфильме: "И так сойдет"
    Более подробно об этом написано на stackoverflow

    Насчет isReadOnly - завел для компонента еще одно свойство, аналогично первым двум (value и key). Работает.
    Ответ написан
    Комментировать
  • Значение за пределами окна datagrid?

    k1lex
    @k1lex
    Программист торг. сети. C# (WPF, WinForms), T-SQL
    По хорошему вам нужно изменить подход и работать с источником данных (о котором написал С Sharp ).
    DataGrid это всего лишь отображение и использовать его как DataGridView из WinForms не стоит.
    Создайте класс. Потом создайте ObserbvaleCollection из элементов этого класса.
    Свойству itemssource присвойте созданную коллекцию. Наслаждайтесь и
    спокойно пишите. Руки у вас будут развязаны. А на поиск подобных решений уйдет гора времени потраченных в итоге впустую.
    Ответ написан
    1 комментарий
  • Как конвертировать ObservableCollection в DataTable?

    k1lex
    @k1lex Автор вопроса
    Программист торг. сети. C# (WPF, WinForms), T-SQL
    В итоге решил так (код взят из интернета).
    Относительно универсальный конвертер LIST в DataTable
    public DataTable ToDataTable<T>(List<T> items)
            {
                var tb = new DataTable(typeof(T).Name);
    
                PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
                foreach (PropertyInfo prop in props)
                {
                    Type t = GetCoreType(prop.PropertyType);
                    tb.Columns.Add(prop.Name, t);
                }
    
    
                foreach (T item in items)
                {
                    var values = new object[props.Length];
    
                    for (int i = 0; i < props.Length; i++)
                    {
                        values[i] = props[i].GetValue(item, null);
                    }
    
                    tb.Rows.Add(values);
                }    return tb;
            }
    
     public static bool IsNullable(Type t)
            {
                return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
            }
    
     public static Type GetCoreType(Type t)
            {
                if (t != null && IsNullable(t))
                {
                    if (!t.IsValueType)
                    {
                        return t;
                    }
                    else
                    {
                        return Nullable.GetUnderlyingType(t);
                    }
                }
                else
                {
                    return t;
                }
            }
    Ответ написан
  • Как реализовать множественный фильтр данных?

    k1lex
    @k1lex Автор вопроса
    Программист торг. сети. C# (WPF, WinForms), T-SQL
    Задачу решил сам поочередной проверкой условий.
    private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
            {
                cgAssortment cgA = e.Item as cgAssortment;
                bool isAccept = true;
    
                if (cgA != null)
                {
                    try
                    {
                        isAccept = isAccept && (!this.cbOnLink.IsChecked.Value || (this.cbOnLink.IsChecked == true && (cgA.Group5GUID == null)));
                        isAccept = isAccept && (!this.cbInMatrix.IsChecked.Value || (this.cbInMatrix.IsChecked == true && (cgA.InMatrix == true)));
                        isAccept = isAccept && (!this.dgGoodsAllF1.IsChecked.Value || (this.dgGoodsAllF1.IsChecked.Value && cgA.Code.ToString() == this.dgGoodsAllT1.Text));
                        isAccept = isAccept && (!this.dgGoodsAllF2.IsChecked.Value || (this.dgGoodsAllF2.IsChecked.Value && (cgA.NameLong.ToUpper().Contains(this.dgGoodsAllT2.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF3.IsChecked.Value || (this.dgGoodsAllF3.IsChecked.Value && (cgA.cgGroup2.NameLong.ToUpper().Contains(this.dgGoodsAllT3.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF4.IsChecked.Value || (this.dgGoodsAllF4.IsChecked.Value && cgA.cgGroup3 != null && (cgA.cgGroup3.NameLong.ToUpper().Contains(this.dgGoodsAllT4.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF5.IsChecked.Value || (this.dgGoodsAllF5.IsChecked.Value && cgA.cgGroup4 != null && (cgA.cgGroup4.NameLong.ToUpper().Contains(this.dgGoodsAllT5.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF6.IsChecked.Value || (this.dgGoodsAllF6.IsChecked.Value && cgA.cgGroup5 != null && (cgA.cgGroup5.NameLong.ToUpper().Contains(this.dgGoodsAllT6.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF7.IsChecked.Value || (this.dgGoodsAllF7.IsChecked.Value && cgA.cgGroup6 != null && (cgA.cgGroup6.NameLong.ToUpper().Contains(this.dgGoodsAllT7.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF8.IsChecked.Value || (this.dgGoodsAllF8.IsChecked.Value && cgA.cgGroup7 != null && (cgA.cgGroup7.NameLong.ToUpper().Contains(this.dgGoodsAllT8.Text.ToUpper()))));
                        isAccept = isAccept && (!this.dgGoodsAllF9.IsChecked.Value || (this.dgGoodsAllF9.IsChecked.Value && cgA.cgGroup8 != null && (cgA.cgGroup8.NameLong.ToUpper().Contains(this.dgGoodsAllT9.Text.ToUpper()))));
                    }
                    catch (Exception er )
                    {
                        MessageBox.Show(er.Message);
                    }
                    e.Accepted = isAccept;
                }
            }


    P.S. Другим предложениям или объяснением как лучше сделать буду только рад.
    Ответ написан
  • Xaml - Как динамически изменять содержимое окна (пример: главное окно -> настройки)?

    k1lex
    @k1lex
    Программист торг. сети. C# (WPF, WinForms), T-SQL
    Способов много.
    Вот несколько:
    1. Используйте MVVM пример
    2. Создание UserControl с содержимым и загрузка их в контейнер типа ContentPresenter
    3. Pages
    4. Шаблоны содержимого
    5. TabPages тоже можно заюзать на крайний случай. В WPF вкладки можно скрывать.
    Ответ написан
    Комментировать